Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Activerecord 通过Rails 3中的关系筛选has_many中的子对象_Activerecord_Ruby On Rails 3_Has Many Through - Fatal编程技术网

Activerecord 通过Rails 3中的关系筛选has_many中的子对象

Activerecord 通过Rails 3中的关系筛选has_many中的子对象,activerecord,ruby-on-rails-3,has-many-through,Activerecord,Ruby On Rails 3,Has Many Through,您好 我有一个应用程序,其中公司和用户需要通过公司成员身份模型相互归属,该模型包含有关成员身份的额外信息(特别是,通过布尔值管理员,用户是否为公司管理员)。代码的简单版本: class CompanyMembership < ActiveRecord::Base belongs_to :company belongs_to :user end class Company < ActiveRecord::Base has_many :company_memberships

您好

我有一个应用程序,其中
公司
用户
需要通过
公司成员身份
模型相互归属,该模型包含有关成员身份的额外信息(特别是,通过布尔值
管理员
,用户是否为公司管理员)。代码的简单版本:

class CompanyMembership < ActiveRecord::Base
  belongs_to :company
  belongs_to :user
end

class Company < ActiveRecord::Base
  has_many :company_memberships
  has_many :users, :through => :company_memberships
end

class User < ActiveRecord::Base
  has_many :company_memberships
  has_many :companies, :through => :company_memberships
end
虽然这样做很有效,但感觉有些效率低下(它在每个成员上迭代,每次都执行SQL,对吗?或者关系比这更聪明吗?),我不确定是否有更好的方法来实现这一点(可能使用范围或Rails 3使用的新奇的
关系
对象?)


如果您有任何关于最佳处理方式的建议(最好使用Rails 3最佳实践),我们将不胜感激

像这样的东西怎么样:

Company.find(:id).company_memberships.where(:admin => true).joins(:user)
has_many :admins, :through => :company_memberships, :class_name => :user, :conditions => {:admin => true}

我认为我这样做是错误的,指定了
公司成员资格
的条件,而不是
用户
,这才是我真正想要的(一个
用户的列表
,而不是
公司成员资格的列表
)。我想我正在寻找的解决方案是:

users.where(:company_memberships => {:admin => true})
它生成以下SQL(对于ID为1的公司):

我还不确定是否需要它,但是
includes()
方法将执行快速加载,以在必要时减少SQL查询的数量:

活动记录允许您在中指定 推进所有正在进行的关联 将要加载。这是可能的 通过指定
包含的方法
模型。查找
调用。包括,, 活动记录确保所有 已加载指定的关联 使用尽可能少的 查询,查询


(我仍然愿意听取任何认为这不是最好/最有效/正确的方法的人的任何建议。)

更干净的方法是将关联添加到您的公司模型中,如下所示:

Company.find(:id).company_memberships.where(:admin => true).joins(:user)
has_many :admins, :through => :company_memberships, :class_name => :user, :conditions => {:admin => true}
您可能需要深入研究以获得准确的语法


你不应该需要:include,除非你有其他与:user相关的类,你可以在你的视图中引用。

我偶然发现了这个答案,并且相信现在有一种更好的方法使用
有很多关联作用域。
():

has\u many关联的第二个参数可以是包含过滤器的proc或lambda。

我制作了gem来实现这一点

有了它,就不需要连接或包含。急切加载仍然是您的选择,而不是义务

users.where_assoc_exists(:company_memberships, admin: true, company_id: @company.id)
关于如何过滤该公司的问题还不清楚,所以我自己添加了这个问题。如果没有这一点,如果一个用户可以在多个公司工作,那么在一个公司做管理员就意味着在另一个公司做管理员

gem在rails3中不起作用,但是我们已经9年了,rails4.1和更多都得到了支持


这是和。请阅读。

中的更多详细信息,再近一步!虽然这不是我一直在寻找的答案,但它让我找到了:)是
:条件
的有效选项吗?它没有出现在文档中。@Cesarbautista这个答案似乎过时了。请参阅标题为“定制查询”的文档,该文档告诉您使用
->
这似乎是2019年的现代方式。您可以在
->
前面添加一个参数,该参数将是您所在模型的实例,允许您在
中引用它,其中
users.where_assoc_exists(:company_memberships, admin: true, company_id: @company.id)