Подтвердить что ты не робот

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

4b9b3361

Ответ 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.