如何对has_many_and_belongs_to关联进行查询?

时间:2018-05-31 14:34:10

标签: ruby-on-rails

我有一个名为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 :(得分:2)

根据您的previous question,您将year个实例作为link_to的参数传递。
在你的控制器中,它返回一个id而不是一年的对象。

所以你可以像这样检索相应的年份:

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

然后,has_and_belongs_to_manyYear之间存在HighlightCategory关系。要查找特定年份的highlight_categories,您可以这样做:

@subjects = @year.highlights_categories

但是,请注意您的模型和表命名约定HighlightCategory模型名称必须具有highlight_categories表名,带下划线(source)。
Year的关系必须是:

has_and_belongs_to_many :highlight_categories 

答案 1 :(得分:0)

我愿意

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

使用连接会将表格添加到您的查询中,这样您就可以从年份表中查询

答案 2 :(得分:0)

渴望加载:

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

懒惰加载:

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

您可以通过here了解joins vs includes

简而言之,在@subjects中迭代集合时,如果使用joins,则数据将延迟加载,而includes将急切加载内存中的所有记录。

两者都有自己的用例。