Ruby on rails 在ActiveRecord where/join调用中引用关联表

Ruby on rails 在ActiveRecord where/join调用中引用关联表,ruby-on-rails,activerecord,join,Ruby On Rails,Activerecord,Join,假设我有两个Rails模型,用户和列表。用户有许多列表,列表属于一个用户 用户在任何给定的时间都有一个特定的列表。这由用户模型上的active_list_id外键表示 假设我想通过ActiveRecord运行与以下查询等效的查询: SELECT * FROM users JOIN lists ON lists.id = users.active_list_id 基本上,我正在尝试编写一个方法,让每个用户,连同她当前的活动列表,在列表完成时显示统计信息 在我看来,解决办法似乎是这样的 User

假设我有两个Rails模型,用户和列表。用户有许多列表,列表属于一个用户

用户在任何给定的时间都有一个特定的列表。这由用户模型上的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最有效地提取这些数据

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


编辑:上面的查询确实有效,但似乎没有将用户记录与其关联列表连接起来。

您的帖子中有一些特别之处。第一件事是:“have_many”这是错误的,它被称为
have_many
,如果它像你写的那样出现在你的模型中,那可能是个问题!然后另一件事是外键的名称!按惯例,外键是以单数形式添加了_id的关联名称。当您说希望拥有v
user.lists
时,外键必须被称为
list\u id
,而不是
active\u list\u id
!通过在关联中传递
外键
选项,可以指定非常规外键!看起来是这样的:

User.find(<id>).lists
User.rb:

has_many :lists, :foreign_key => 'active_list_id'
List.rb:

belongs_to :user, :foreign_key => 'active_list_id'
那么你可以这样说:

User.find(<id>).lists
然后您可以调用
User.active\u list()
以获取使用此列表的所有用户

试试这个:

Users.includes(:lists).where("users.active_list_id  = lists.id") 
您在问题中所做的是加载符合该条件的用户,而您想要的也是加载

尽管如此,您可能需要考虑将这一个独立的关联:

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

class List
  has_one :user
end

通常表名是“用户”和“列表”——这可能是您的问题吗?很好,但不是,这是我的错误。这些表实际上是小写的。为了清楚起见,我将编辑我的问题,谢谢。我误解了,问题是查询,而不是表格。您是对的,没有大写的查询返回我需要的用户,但是它似乎也不包括列表记录。该死。嗯,你所做的看起来是正确的。您在mysql控制台中尝试过这种SQL吗?你有没有试过用一个更简单的where子句(比如,'lists.id=1'或一些无关紧要的东西)来隔离它的故障点?我在sql控制台(实际上是sqlite)中试过了…sql中的查询返回两个连接的表记录…*headcratch*确实,这是一时的疏忽,事实上,在我的模型中不是这样的……想想看,我读了五遍这个问题>\u干杯,这很好,我认为使用一个作用域将保持代码的干涸,考虑到我可能会经常使用这个作用域,这非常适合这个项目。非常感谢=)请注意,使用
lambda
会带来性能问题。在RDMBS的某些使用中,lambda可以将所有数据加载到内存中,然后根据条件在内存中循环。
lambda
问题有时被称为和
N+1
问题,除了说“永不说永不”外,永远不要说永不这是因为它允许我将结果插入一个变量中,然后在它们之间爬行,找到每个变量的完成统计信息,并相应地对它们进行排序。我想知道这样做是更好,还是只进行一次查询,将必要字段添加到结果中(即,将lists.pct_completed添加到每个用户记录中)……无论如何,感谢您的帮助。