我有一个名为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。
我该怎么做?
答案 0 :(得分:2)
根据您的previous question,您将year
个实例作为link_to的参数传递。
在你的控制器中,它返回一个id而不是一年的对象。
所以你可以像这样检索相应的年份:
@year = Year.find(params[:year])
然后,has_and_belongs_to_many
和Year
之间存在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
将急切加载内存中的所有记录。
两者都有自己的用例。