Rails - отношение HABTM - как я могу найти запись, основанную на атрибуте ассоциированной модели
Я установил эту связь HABTM в прошлом и ее работал до этого.... Теперь это не так, и я нахожусь в своем уме, пытаясь понять, что случилось. Я весь день просматриваю путеводители по рельсам и не могу понять, что я делаю неправильно, поэтому помощь будет действительно оценена.
У меня есть 2 модели, подключенные через модель соединения, и я пытаюсь найти записи, основанные на атрибуте связанной модели.
Event.rb
has_and_belongs_to_many :interests
Interest.rb
has_and_belongs_to_many :events
и миграции таблицы соединений, которая была создана как
create_table 'events_interests', :id => false do |t|
t.column :event_id, :integer
t.column :interest_id, :integer
end
Я пробовал
@events = Event.all(:include => :interest, :conditions => [" interest.id = ?", 4 ] )
Но получилась ошибка: "Ассоциация с именем" интерес "не найдена, возможно, вы ее набрали?"... что я, конечно, не знал
Я пробовал
@events = Event.interests.find(:all, :conditions => [" interest.id = ?", 4 ] )
но получил ошибку "undefined метод" интересы "для #Class: 0x4383348"
Как я могу найти события, у которых есть id интереса 4.... Я определенно собираюсь лысый из этого lol
Ответы
Ответ 1
Вам нужно включить таблицу интересов.
@events = Event.all(:include => :interests, :conditions => ["interests.id = ?", 4])
У вас это было правильно на вашем посту, но вы не использовали плюрализующие интересы.
Обновить
Поскольку этот ответ все еще привлекает внимание, я подумал, что было бы неплохо обновить его, используя синтаксис ActiveRecord::Relation
, поскольку вышеупомянутый способ будет устаревшим.
@events = Event.includes(:interests).where(interests: { id: 4 })
или
@events = Event.includes(:interests).where('interests.id' => 4)
Ответ 2
Ответ был полезен, спасибо! Я знаю, что этот пост старый, но я придумал другое решение, которое может быть полезно кому-то. Я заметил, что генерация запроса была довольно длинной в моем случае. Для меня таблица, которая была приравнивается к вашей таблице "интересов", имела в ней много столбцов и данных. Чтобы избежать поиска этой таблицы для соответствующего идентификатора, мое решение выглядело примерно так:
@events = Event.all.where('events.id' => @interest.events.each(&:id))
Это сработало для меня, так как у меня уже был объект instinter @interest со списком идентификаторов для событий. Конечно, вы не используете волшебство, которое имеет рельсы. Кроме того, я не мог заставить ваше решение работать с "нет". Например:
@events = Event.includes(:interests).where.not(interests: { id: 4 })
не будет работать. Он вернет 0 результатов. Но это:
@events = Event.all.where.not('events.id' => @interest.events.each(&:id))
который возвратит все события, которые не имеют ассоциации с @interest.