这是我简化的情况:
class Producer
has_and_belongs_to_many :rules
end
class Rule
has_and_belongs_to_many :producers
end
但Rule
碰巧遵循STI结构。所以我有这个:
class Producer
has_and_belongs_to_many :rules
has_and_belongs_to_many :product_rules, join_table: :producers_rules,
association_foreign_key: :rule_id
has_and_belongs_to_many :fee_rules, join_table: :producers_rules
association_foreign_key: :rule_id
end
class Rule
has_and_belongs_to_many :producers
end
class ProductRule < Rule
end
class FeeRule < Rule
end
没什么大不了的,做得很好。所以现在我想创建一个仅返回与Producers
ProductRules
的范围
等同于此的东西:
Producer.all.select{|x| x.product_rules.any? }
有人能指出快速解决方案吗?
注意:我显然不想加载所有生产者并在之后选择它们,我想直接加载正确的
更新
我正在使用Rails版本2.3.15
答案 0 :(得分:1)
Producer
和Rule
之一的子类之间的每个关联都将在连接表上创建一个单独的记录。您可以使用该事实并选择在连接表上有任何记录的所有Producer
指向它们(注意选择正确的type
):
在Rails 2.x中:
class Producer
def self.with_some_product_rule
scoped(conditions: <<-SQL)
producers.id IN (
SELECT producer_id FROM producers_rules
INNER JOIN rules ON rules.id = producers_rules.rule_id
WHERE rules.type = 'ProductRule'
)
SQL
end
end