我有一个具有以下型号的网络应用程序:班次,年份,结帐,销售和访客。
转移has_many结帐,销售,访客 A year has_many Shifts
结帐,销售和访客属于Shift 班次属于年度
在我的应用程序中,我想要有很多不同的年份,尽管在任何给定时间只有一个活跃。例如,当我显示移位时,我只希望显示活动年份的移位。这很容易。
我真正遇到的困难是写一个查询来获取活跃年份的所有结账。有一个简单的方法可以做到这一点吗?活动年份实际上设置在名为session [:current_year_id]的会话变量中。我认为最好的办法是做一些事情:
@checkouts = Shift.where('year_id = ?',session[:current_year_id]).checkouts
但那不适合我。我需要做些什么才能让它发挥作用?
请注意,结帐,销售和访问者没有自己的year_id。他们通过他们所属的班次有一年一年。
解决:
我赞成所有答案,因为一切都有帮助。我使用了for_year lambda表达式。我赞成了所有的答案。
最后的答案是使用:
Shift.for_year(session[:current_year_id]).collect{ |shift| shift.checkouts }
答案 0 :(得分:2)
您可以在Shift模型中创建一个范围,该范围将当前年份作为参数:
class Shift < ActiveRecord::Base
has_many :checkouts
scope :for_year, lambda { |current_year_id| where('year_id = ?', current_year_id) }
end
并且在控制器中,您可以通过链接到范围来获取当前年份的结帐:
Shift.for_year(session[:current_year_id]).map(&:checkouts)
答案 1 :(得分:1)
你可以尝试:
Shift.find_all_by_year_id(session[:current_year_id])
这假设current_year_id
在会话中。
我在使用.where
时遇到了问题,我使用动态查找器进行了修复。
答案 2 :(得分:1)
使用.where
会返回一个关系,因此根据您的意图有两种可能的答案。
如果您想查找属于第一个班次的结帐,请执行以下操作:
@checkouts = Shift.where('year_id = ?',session[:current_year_id]).first.checkouts
如果您希望所有结帐的所有结帐,请执行以下操作:
@checkouts = Shift.where('year_id = ?',session[:current_year_id]).collect{|shift| shift.checkouts}