在ActiveRecord中引用关联表,其中/ join调用

时间:2012-01-19 22:15:22

标签: ruby-on-rails activerecord join

假设我有两个Rails模型,用户和列表。用户拥有__列表和列表属于用户。

用户还可以在任何给定时间使用他们正在处理的特定列表。这由User模型上的active_list_id外键表示。

假设我想通过ActiveRecord运行以下查询的等效内容:

SELECT * FROM users JOIN lists 
ON lists.id = users.active_list_id

基本上我正在尝试编写一个方法,让每个用户及其当前活动列表显示列表完成的统计信息。

在我看来,解决方案就像是

Users.joins(:lists).where("users.active_list_id  = lists.id") 

但我似乎无法让它工作**,而且我不确定Rails中最正确的解决方案是什么。

如何使用ActiveRecord最有效地提取此数据?

提前感谢您提供的任何帮助。

编辑:上面的查询确实有效,但似乎没有拉出用户记录及其相关列表的连接。

2 个答案:

答案 0 :(得分:1)

你的帖子上有一些扼杀的东西。第一件事是:“have_many”错误地称之为has_many,如果它在你的模型中就像你写下来那样可能会有问题!那么另一件事就是外键的名字!按惯例,外键是单数的关联名称,加上_id。当你说你想要hasv user.lists时,外键必须被称为list_id而不是active_list_id!您可以通过在关联中传递foreign_key选项来指定非常规外键!这看起来像这样:

User.rb:

has_many :lists, :foreign_key => 'active_list_id'

List.rb:

belongs_to :user, :foreign_key => 'active_list_id'

然后你可以这样说:

User.find(<id>).lists

你永远不会使用SQL连接rails中的表!不要试图将PHP知识转移到RoR 1到1,只是不要!

//啊啊,现在我明白你所拥有的是一个带参数的范围! User.rb:

scope :active_list, lambda{|list_id| where(:active_list_id =>  list_id)}

然后,您可以致电User.active_list(<list_id>)让所有用户使用此列表!

答案 1 :(得分:1)

试试这个:

Users.includes(:lists).where("users.active_list_id  = lists.id") 

您在问题中所做的是加载符合该条件的用户,而您想要的是eager-load the association以及

尽管如此,您可能需要考虑将其作为单独的关联:

class User
  belongs_to :active_list, :class_name => :list
end

class List
  has_one :user
end