Трудно создать область класса для отношения HABTM

Это моя упрощенная ситуация:

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


person Rafael Ramos Bravin    schedule 12.03.2014    source источник


Ответы (1)


Каждая связь между Producer и одним из подклассов Rule будет создавать отдельную запись в таблице соединений. Вы можете использовать этот факт и выбрать все Producer, у которых есть какая-либо запись в таблице соединений, указывающая на них (заботясь о правильном выборе type):

В рельсах 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
person Renato Zannon    schedule 12.03.2014