Ruby on rails Rails activerecord包括。如何访问包含的列?

Ruby on rails Rails activerecord包括。如何访问包含的列?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我的用户模型有很多:事件用户,事件用户属于:用户。我想用下面的sql语句将用户与一位特定的活动赞助人结合起来: SELECT * FROM `users` INNER JOIN `event_patrons` ON `event_patrons`.`user_id` = `users`.`id` WHERE `event_patrons`.`event_id` = 1 因此,在rails中,我尝试了以下方法: User.all(:joins => :event_patrons,

我的用户模型
有很多:事件用户
,事件用户
属于:用户
。我想用下面的sql语句将用户与一位特定的活动赞助人结合起来:

SELECT * FROM `users` 
INNER JOIN `event_patrons` ON `event_patrons`.`user_id` = `users`.`id` 
WHERE `event_patrons`.`event_id` = 1
因此,在rails中,我尝试了以下方法:

User.all(:joins => :event_patrons, 
         :conditions => {:event_patrons => {:event_id => 1}})
但这给了我
选择用户。*
而不是
选择*

SELECT `users`* FROM `users` 
INNER JOIN `event_patrons` ON `event_patrons`.`user_id` = `users`.`id` 
WHERE `event_patrons`.`event_id` = 1
然后,我尝试将
:joins
:include
切换,结果得到了一堆乱七八糟的东西,仍然只返回
User
中的列,而
EventPatron
中的列


我遗漏了什么?Rails故意这么做。您应该像这样使用查询:

User.all(:joins => :event_patrons, 
         :conditions => {:event_patrons => {:event_id => 1}}
         :include => :event_patrons)
@users.each do |user|
  user.event_patrons.first.event_id
end
这将生成2个查询。一个供用户使用:

SELECT `users`.* FROM `users` 
INNER JOIN `event_patrons` ON `event_patrons`.`user_id` = `users`.`id` 
WHERE `event_patrons`.`event_id` = 1
一个用于相关活动的赞助商:

SELECT `event_patrons`.* FROM `event_patrons` WHERE `event_patrons`.`id` IN (1,2,3...)

您可以通过指定:select选项来做您想做的事情,但我不建议这样做,因为这样它就不会构造事件用户模型,而是将数据保留在用户模型中。

为了完成:

在rails 3中,您实际上可以只使用一个查询,但他们也建议使用联接: 用户。包括(:事件用户)。其中(“事件用户。事件id”,1)

资料来源:

我一开始也对连接和包含感到困惑,但有一个很大的区别:

  • include基本上对关联进行了快速加载。当您要执行以下操作时,这非常有用:

    User.all(:joins => :event_patrons, 
             :conditions => {:event_patrons => {:event_id => 1}}
             :include => :event_patrons)
    
    @users.each do |user|
      user.event_patrons.first.event_id
    end
    
    如果您有100个用户,那么您只需要生成100个额外的查询(1+N问题)

  • 有时,您需要指定关联的条件(就像在您的案例中),这是连接有用的地方,但不要过度滥用它,否则您将遇到笛卡尔乘积重载问题

    关于这一切的一篇优秀文章:可以在这里找到,可能适用于rails 2.1,但仍然适用于rails 3: