debug记录 第五周星期六

这是controller index的code @order_twos = OrderTwo.where(:asker_user_id => current_user.id) || OrderTwo.where(:poster_user_id => current_user.id)) 我们要对不同的用户显示不同的ordertwo信息。 这里是index views

  <% if order.poster_user == current_user %>
    <td><%= link_to(order.asker_user.email, account_user_path(order.asker_user))%></td>
  <% else %>
    <td><%= link_to(order.poster_user.email, account_user_path(order.poster_user))%></td>
  <% end %>

但是上面的controller写法只能显示前面的OrderTwo的信息。 于是想用这个一个判断句来实现功能

    if current_user.id == OrderTwo.find(params[:id]).asker_user_id
      @order_twos = OrderTwo.where(:asker_user_id => current_user)
    else
    @order_twos = OrderTwo.where(:poster_user_id => current_user)
  end

但是这样找不到params找不到id,不知道怎么想的自己把find改成find_by就可以,窝草瞬间感觉自己屌炸了。。 冷静2s后,越想越不对。以前老师讲过是find_by是不会报错的。find没有的值,find_by也应该是nil啊,也应该是一个 空值,为什么出现了我想要的结果呢?? 请教了高睿同学,明白了find_by(nil)也是会找到值的,通常是ordertwo的第一个,也可能是随机的。而且为什么 find(params[:id])找不到id呢,是因为我们设置路由的时候,是account_order_twos_path,它是没有id的, 这样写是有id的 account_order_two_path(@order_two)我们把鼠标移到navber上的按钮的时候可以判断显不显示id 其实我一开始的思路就是错的,就是要判断一下用or就应该可以,重新googleRails: How to chain scope queries with OR instead of AND?

+    def test_or_with_relation
 +      expected = Post.where('id = 1 or id = 2').to_a
 +      assert_equal expected, Post.where('id = 1').or(Post.where('id = 2')).to_a
 +    end
  @order_twos = OrderTwo.where(:asker_user_id => current_user.id).or(OrderTwo.where(:poster_user_id => current_user.id))  携程current_user也是可以的

参考资料:http://stackoverflow.com/questions/3684311/rails-how-to-chain-scope-queries-with-or-inst ead-of-and https://github.com/rails/rails/commit/9e42cf019f2417473e7dcbfcb885709fa2709f89 https://github.com/rails/rails/issues/14867 http://apidock.com/rails/v4.0.2/ActiveRecord/FinderMethods/find_by