假设我有两个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最有效地提取此数据?
提前感谢您提供的任何帮助。
编辑:上面的查询确实有效,但似乎没有拉出用户记录及其相关列表的连接。
答案 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