Ruby on rails 从(即将变瘦的)控制器移动到(不太胖的)模型
我几乎不懂rails,更不用说ruby了,所以这可能是一个简单的问题。在我的一个控制器的show action中,我定义了一个变量来计算某些项目的总数,如下所示:Ruby on rails 从(即将变瘦的)控制器移动到(不太胖的)模型,ruby-on-rails,variables,model,controller,Ruby On Rails,Variables,Model,Controller,我几乎不懂rails,更不用说ruby了,所以这可能是一个简单的问题。在我的一个控制器的show action中,我定义了一个变量来计算某些项目的总数,如下所示: @total_of_items = SomeModel.where(:user_id => @user).sum(:amount) 这显然收集了这个特定用户的所有数量属性,并将它们相加。因此,在我看来,我只是呼吁: <%= @total_of_items %> 它出现了。所以有两个问题。首先,这真的是做类似事
@total_of_items = SomeModel.where(:user_id => @user).sum(:amount)
这显然收集了这个特定用户的所有数量属性,并将它们相加。因此,在我看来,我只是呼吁:
<%= @total_of_items %>
它出现了。所以有两个问题。首先,这真的是做类似事情的最好方式吗?因为我可能想要获取这个值,并在另一个用户的视图中显示它,以比较两者,或者类似的东西。似乎为了做到这一点,这必须是模型中的一个方法?我只是不确定
我的第二个问题是如何获取控制器中定义的变量并将其放入模型中。这似乎是一种更为“瘦控制器胖模型”的做事方式。没有什么帮助?这就是
作用域出现的地方。在您的模型中:
scope :sum_by_user, lambda {|user| where(:user_id => user).sum(:amount) }
然后在控制器中:
@total_of_items = SomeModel.sum_by_user(@user)
@total_of_items = SomeModel.amount_sum(@user)
你甚至可以链接示波器,这真是太棒了
这是范围出现的地方。在您的模型中:
scope :sum_by_user, lambda {|user| where(:user_id => user).sum(:amount) }
然后在控制器中:
@total_of_items = SomeModel.sum_by_user(@user)
@total_of_items = SomeModel.amount_sum(@user)
你甚至可以链接示波器,这真是太棒了
您可以通过创建作用域(如@apReading所示)或通过封装查询的方法简化控制器:
def self.amount_sum(user)
where(:user_id => user).sum(:amount)
end
然后在控制器中:
@total_of_items = SomeModel.sum_by_user(@user)
@total_of_items = SomeModel.amount_sum(@user)
在本例中,我将使用该方法,因为范围更难阅读。Ryan Bates在他的报告中指出了这一点:
在我们使用的第二个命名范围中
羔羊。如果你用过其中一个
在命名的范围内,您可以考虑
改为使用类方法
尤其是当你路过一个
大量参数或如果
范围的内容很复杂。我们的
这相当简单,但我们将把它
不管怎样,它都会被转换为类方法
您的情况很简单,但我会考虑将逻辑放在类方法中。
< P>您可以通过创建范围(如@ APNEADIVE演示)或封装查询的方法来简化控制器:
def self.amount_sum(user)
where(:user_id => user).sum(:amount)
end
然后在控制器中:
@total_of_items = SomeModel.sum_by_user(@user)
@total_of_items = SomeModel.amount_sum(@user)
在本例中,我将使用该方法,因为范围更难阅读。Ryan Bates在他的报告中指出了这一点:
在我们使用的第二个命名范围中
羔羊。如果你用过其中一个
在命名的范围内,您可以考虑
改为使用类方法
尤其是当你路过一个
大量参数或如果
范围的内容很复杂。我们的
这相当简单,但我们将把它
不管怎样,它都会被转换为类方法
你的情况很简单,但是我会考虑把逻辑放在类方法中。
我更喜欢使用范围,因为它们更清楚地表达意图。因此,我建议使用@apheading的答案;)我更喜欢使用范围,因为它们更清楚地表达了意图。因此,我建议使用@apheading的答案;)