加入两个模型并获取记录

时间:2017-07-13 17:31:47

标签: ruby-on-rails

在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

1 个答案:

答案 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声明获得的语法糖的一部分是,您可以使用更简化的版本,而不必亲自指责它。