在rails应用程序上,我有用户和请求模型。之间的关系如下;
User
has_many :requests
Request
belongs_to :user
我有@users
变量,它由一些用户组成(比如前10个用户)。我想获得属于@users
的所有请求。
我已经开始了;
@users.joins(:requests)
但返回用户。我想得到这些用户的所有要求。
当我尝试时;
Request.all.joins(:users).where(:requests => {user_id: @users.id})
给出错误,因为@users
不是单个记录。
错误:
Request.all.joins(:users).where(:requests => {user_id: @users.id}).all
NoMethodError: undefined method `id' for #<User::ActiveRecord_Relation:0x007fa573710bb8>
from /Users/shalafi/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.0/lib/active_record/relation/delegation.rb:136:in `method_missing'
from /Users/shalafi/.rvm/gems/ruby-2.2.3/gems/activerecord-4.2.0/lib/active_record/relation/delegation.rb:99:in `method_missing'
from (irb):20
答案 0 :(得分:3)
你可以这样做:
Request.where(user: @users)
Rails很聪明。它基本上是这样做的:
Request.where(user_id: @users.ids)
基本上是这样做的:
Request.where(user_id: @users.map{|u| u.id})
现在,你可以自己做所有的加入(当你开始做)。但是,为什么要这样做?
这不是:
Request.where(user: @users)
在此期间让你感觉像彩虹和棉花糖:
Request.all.joins(:users).where(:requests => {user_id: @users.map{|u|u.id}})
让你感觉像蜘蛛和蠕虫?
您使用belongs_to :user
声明获得的语法糖的一部分是,您可以使用更简化的版本,而不必亲自指责它。