Rails — объединить несколько проходов has_many

Я только начал работать с Rails, и у меня возникла проблема, которую я не могу решить сам:

User.rb:

has_many :bid_listings, through: :bids, source: :listing, uniq: true          
has_many :offer_listings, through: :offers, source: :listing, uniq: true

Оба этих возвращаемых листинга, а также использование методов/областей из модели листинга по отдельности работают отлично. Однако, когда я пытаюсь объединить их, я получаю массив, где я не могу применить методы и области действия модели листинга.

Я пробовал несколько способов, но застрял. Пожалуйста помоги.

P.S. У пользователя много ставок, у пользователя много предложений, ставка относится к списку, предложение относится к списку


person Maximoff    schedule 26.08.2012    source источник
comment
Как вы их комбинируете? И вы уверены, что вызываете методы и области действия из списка объектов? Включите некоторые выходные данные   -  person anxiety    schedule 26.08.2012
comment
Например: у меня есть область действия листинга, которая применяется к bid_listings или offer_listings, например: bid_listings.search('something') Однако, когда я пытаюсь объединить результаты bid_listings + offer_listings, я получаю массив. Я пытался создать отношение, используя finder_sql и UNION, но безуспешно.   -  person Maximoff    schedule 26.08.2012
comment
Включите код, который вы пишете, который терпит неудачу, и вывод ошибки как часть вопроса - легче увидеть то, что вы, возможно, упускаете из виду.   -  person anxiety    schedule 26.08.2012
comment
gist.github.com/5bb7725fbc81a38d6810   -  person Maximoff    schedule 26.08.2012


Ответы (2)


Вы вызываете метод экземпляра для объекта Array, а не для объекта ActiveRecord. Следовательно, объект типа Array не знает, что такое метод поиска. Попробуйте это:

Изменить

user = User.first
listings = Listing.joins(:bids).joins(:offers).where(:bids => {:user_id => user.id}, :offers => {:user_id => user.id})
listings.search('a')
person anxiety    schedule 26.08.2012
comment
Это другое отношение к другому иностранному ключу, его нельзя использовать таким образом :) - person Maximoff; 26.08.2012
comment
Пользователь может быть покупателем листинга, а может быть продавцом. User.listings будет возвращать списки, которые он продает, независимо от того, возвращают ли user.bid_listings и user.offer_listings списки, где он разместил свою ставку или оставил предложение продавцу. - person Maximoff; 26.08.2012
comment
Как насчет ситуации, когда мне нужно это как область действия, а пользователь неизвестен? - person Maximoff; 30.08.2012
comment
Во-первых, области обычно не являются переменными (вы не передаете им параметры). Во-вторых, если вы не знаете пользователя, не означает ли это, что вы хотите искать во всех объявлениях — Listing.all.search('a')? - person anxiety; 30.08.2012

У меня была аналогичная проблема, и лучшее решение, которое я придумал, было что-то вроде:

def buying_listings
  Listing.find_by_sql(bid_listings.union(offer_listings).to_sql)
end

Этот способ по-прежнему должен позволять вам продолжать область видимости, но менее эффективен, поскольку будет выполнять дополнительный запрос.

person qnm    schedule 14.02.2013