在我看来,您当前的设置使用AdvertisersAccountGroup 作为连接表;因此,我建议使用has_many :through 关联。
为此,您只需按如下方式切换模型:
class Advertiser < ActiveRecord::Base
has_many :v2_account_account_groups, through: :advertisers_account_groups
has_many :advertisers_account_groups
...
end
class V2Account::AccountGroup < ActiveRecord::Base
has_many :advertisers, through: :advertisers_account_groups
has_many :advertisers_account_groups
...
end
class AdvertisersAccountGroup < ActiveRecord::Base
belongs_to :advertiser
belongs_to :v2_account_account_group, class_name: 'V2Account::AccountGroup', foreign_key: 'account_group_id'
...
end
这将允许您根据需要查询advertiser,即advertiser.v2_account_account_groups。
但是,这种关联在广告商和 v2 帐户组之间是多对多的,因此,您将无法调用 advertiser.v2_account_account_groups.name,因为 advertiser.v2_account_account_groups 返回的是集合而不是单个记录。
您可以使用advertiser.v2_account_account_groups.map(&:name)(获取所有组名称的数组)或advertiser.v2_account_account_groups.first&.name,但如果广告客户应该只有一个 v2 帐户组,您可能需要重新构建数据。
这是否有意义并且听起来像您正在寻找的东西?如果您有任何问题,请告诉我。
编辑:
根据您的评论,我认为您应该能够构造如下查询:
Advertiser.includes(advertiser_account_groups: : v2_account_account_group)
.where(advertiser_account_groups: { v2_account_groups: { name: "something" } })
这听起来像您正在寻找的吗?
有几点需要注意:
- 在引用
includes 中的关联时,您希望使用关联名称
-
然而,将这些插入
where 子句时,您需要使用完整的表名,因为它们在数据库中(可通过Model.table_name 搜索)
另外,在您的评论中,您提到了添加media_type: "line",下面还包括:
Advertiser.includes(advertiser_account_groups: : v2_account_account_group)
.where(media_type: "line", advertiser_account_groups: { v2_account_account_groups: { name: "something" } })
在您的代码中构建它的最佳方式可能是作为广告商模型中的一个范围,例如:
scope :by_v2_group_name, -> (name) { includes(advertiser_account_groups: :v2_account_account_group)
.where(media_type: "line", advertiser_account_groups: { v2_account_account_groups: { name: "something" } }) }
或
scope :by_v2_group_name, (lambda do |name|
includes(advertiser_account_groups: :v2_account_account_group)
.where(media_type: "line", advertiser_account_groups: { v2_account_account_groups: { name: "something" } })
end)
这样您就可以保持代码干净并调用Advertiser.by_v2_group_name("something")。
让我知道您的进展情况,我们会根据需要进行处理 :)