Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 从(即将变瘦的)控制器移动到(不太胖的)模型_Ruby On Rails_Variables_Model_Controller - Fatal编程技术网

Ruby on rails 从(即将变瘦的)控制器移动到(不太胖的)模型

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 %> 它出现了。所以有两个问题。首先,这真的是做类似事

我几乎不懂rails,更不用说ruby了,所以这可能是一个简单的问题。在我的一个控制器的show action中,我定义了一个变量来计算某些项目的总数,如下所示:

@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的答案;)