2011-04-28 67 views
0

我几乎不懂轨道,更不用说红宝石,所以这可能是一个简单的。在我的控制器的show动作之一,我有我已经定义来计算总的一些项目的变量,看起来是这样的:从(很快瘦)的控制器移动到(不太胖)模型

@total_of_items = SomeModel.where(:user_id => @user).sum(:amount) 

这显然收集所有量的属性,这个特殊的用户,并增加了他们向上。所以在我看来我只是打电话:

<%= @total_of_items %> 

它显示出来。所以有两个问题。首先,这真的是做这种事情的最佳方式吗?因为我可能想要取这个值并在另一个用户的视图中显示它来比较两者,或者类似的东西。这似乎是为了做到这一点,这必须是模型中的一种方法?我只是不确定。

我的第二个问题是如何获取控制器中定义的变量并将其放入模型中。看起来这是更“瘦瘦的控制器胖模式”的做事方式。帮助不大?

回答

0

您可以通过创建一个范围(如@apneadiving证明)简化控制器,或由一个封装查询的方法:

def self.amount_sum(user) 
    where(:user_id => user).sum(:amount) 
end 

然后在你的控制器:

@total_of_items = SomeModel.amount_sum(@user) 

在这种情况下,我会使用该方法,因为范围有点难以阅读。瑞安贝茨使注意到这一点在他的Railscast 215

在我们使用 拉姆达第二个命名范围。如果您在指定范围内使用这些 其中之一,则可能会考虑使用 而不是 ,尤其是如果您传入大量参数或 内容是复杂的。我们的 是相当简单的,但我们将它变成一个类方法无论如何变成 。

你的情况很简单,但我会考虑将逻辑放在类方法中。

+0

我更喜欢使用范围,因为它们更清楚地表达意图。所以我会建议使用@ apneadiving的答案;) – nathanvda 2011-04-29 00:09:36

相关问题