Как сделать запрос об ассоциации has_many_and_belongs_to? - PullRequest
0 голосов
/ 31 мая 2018

У меня есть экземпляр с именем Year, а другой с именем HighlightCategory.Точно так же:

class HighlightCategory < ActiveRecord::Base
   has_and_belongs_to_many :years 
end

class Year < ActiveRecord::Base
  :name
  has_and_belongs_to_many :highlightCategories
end

Я создаю контроллер, который хочет проверить все категории HighlightCategories за определенный год.Например:

if (params[:year])
    @year = Year.where(year: params[:year] )
    @subjects = HighlightCategory.where(HOW TO MAKE IT)
else

Я хочу сделать запрос, в котором я просто возвращаю категории HighlightCategories, которые связаны с этим конкретным годом.

Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Стремительно загружено:

@subjects = HighlightCategory.includes(:years).where(years: { year: @year })

Лениво загружено:

@subjects = HighlightCategory.joins(:years).where(years: { year: @year })

Вы можете прочитать о joins против includes более здесь .

Короче говоря, при выполнении итерации по коллекции в @subjects, если используется joins, тогда данные будут загружаться с отложенной загрузкой, тогда как includes будет загружать все записи в памяти.

Оба имеют свои варианты использования.

0 голосов
/ 31 мая 2018

Согласно вашему предыдущему вопросу , вы передаете экземпляр year в качестве параметров вашего link_to.
В вашем контроллере он возвращает идентификатор, а не объект года.

Таким образом, вы можете получить соответствующий год следующим образом:

@year = Year.find(params[:year])

Тогда у вас есть has_and_belongs_to_many отношение между Year и HighlightCategory.Чтобы найти наиболее интересные_категории для этого конкретного года, вы можете просто:

@subjects = @year.highlights_categories

Однако соблюдать правила именования моделей и таблиц : HighlightCategory имя модели должно иметь highlight_categories имя таблицы с подчеркиванием ( источник ).
и отношение для Year должно быть:

has_and_belongs_to_many :highlight_categories 
0 голосов
/ 31 мая 2018

Я бы сделал

@subjects = HighlightCategory.joins(:years).where(years: {year: params[:year]})

, используя объединения, добавит таблицу к вашему запросу, и это позволит вам делать запросы из таблицы лет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...