Rails过滤最佳实践

时间:2011-08-22 02:37:45

标签: ruby-on-rails

我有一个具有以下型号的网络应用程序:班次,年份,结帐,销售和访客。

转移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 } 

3 个答案:

答案 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}