2014-09-25 5 views
0

У меня есть класс Product, который has_many через Connection экземпляры класса. Я хочу запросить, чтобы найти продукты, которые имеют как end_a, так и end_b. Метод текущего класса работает с 2-мя предостережения:Запрос ActiveRecord, основанный на нескольких объектах через has_many отношение

  • не сумеет правильно вернуться, если поиск где end_a и end_b одинаковы. Вместо этого следует искать, если product имеет 2 экземпляра, а не только один из объектов.
  • Возвращает Array, когда я хочу ActiveRecord_Relation.

Ниже приведен метод класса .query, любые отзывы или идеи оценены.

class Product < ActiveRecord::Base 

    has_many :connections, dependent: :destroy, as: :connectionable 
    has_many :genders,  through: :connections 

    def self.query(end_a, end_b) 
    search_base = active.joins(:connections) 
    end_a_search = search_base.where(connections: { gender_id: end_a }) 

    end_a_search & search_base.where(connections: { gender_id: end_b }) 
    end 
end 

пс: После того, как это понял, скорее всего, это движение в рамки для Product

+1

Какие соединения? Присоединиться к модели? – BroiSatse

+0

@BroiSatse Исправлено выше, но 'Genders' принадлежит' Product' через 'Connections' – barnett

+0

' scope: some_query, -> (end_a, end_b) Product.joins (: connections) .where ("connections.gender_id =? OR connections.gender_id =? ", end_a, end_b)' – bjhaid

ответ

1
class Product < ActiveRecord::Base 
    has_many :connections, dependent: :destroy, as: :connectionable 
    has_many :genders, through: :connections 

    scope :with_genders, -> (end_a, end_b) { 
    relation = joins('INNER JOIN connections c1 ON c1.connectionable_id = products.id AND c1.connectionable_type = \'Product\'') 
     .joins('INNER JOIN connections c2 ON c1.connectionable_id = c2.connectionable_id AND c2.connectionable_type = \'Product\'') 
     .where(c1: {gender_id: end_a}, c2: {gender_id: end_b}) 
     .group('products.id') 
    end_a == end_b ? relation.having('COUNT(products.id) > 1') : relation 
    } 
end 
+0

Я извиняюсь, но 'connections' является полиморфным, поэтому, когда я попытался использовать вышеперечисленное и даже заменил' product_id' на 'connectionable_id', он все равно не смог корректно вернуться, если поиск, где' end_a' и 'end_b' совпадают. – barnett

+0

См. Обновленный ответ. Также в будущем попробуйте предоставить всю необходимую информацию в своем вопросе - сделав это, вы экономите время тех людей, которые вам помогают. – trushkevich

+0

Прошу прощения за то, что раньше не упоминал полиморфную модель. Но я выполнил вашу обновленную область и получаю сообщение об ошибке 'PG :: UndefinedColumn: ERROR: столбец« Продукт »не существует LINE 1'. Спасибо за вашу помощь. – barnett