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)
如果您有100个用户,那么您只需要生成100个额外的查询(1+N问题)@users.each do |user| user.event_patrons.first.event_id end
- 有时,您需要指定关联的条件(就像在您的案例中),这是连接有用的地方,但不要过度滥用它,否则您将遇到笛卡尔乘积重载问题 关于这一切的一篇优秀文章:可以在这里找到,可能适用于rails 2.1,但仍然适用于rails 3: