Rails 4:在模型中进行数据库操作是不好的做法吗?

时间:2014-04-16 06:03:46

标签: ruby-on-rails rails-activerecord

假设我有产品型号(app/models/product.rb),并且模型中有以下方法def。

def update_stock product
  product.stock -= 1
  product.save(:validation => false)
end

这可以接受吗?

提前致谢。

4 个答案:

答案 0 :(得分:3)

将数据库操作和应用程序的业务逻辑保留在模型中是一种很好的做法。 Model使用ORM(对象关系映射)直接与数据库交互。同样在rails中,约定控制器应该很薄,模型应该很胖。这个答案详细解释了它

What is Ruby on Rails ORM in layman's terms? Please explain

答案 1 :(得分:2)

这看起来很可疑 - 你说这是你的产品模型中的一种方法,但是这个方法会更新一个完全不同的产品实例(你传入的那个,而不是你调用方法的实例)。

如果是这样的话:

class Product < ActiveRecord::Base
  def update_stock
    self.stock -= 1
    save
  end
end

然后它会更合适。 (update_stock似乎也不是该方法的最佳名称,并且跳过验证可能不是一个好主意。)

答案 2 :(得分:1)

如果您想更新某些内容,请使用update_attributes!

可能是这样写的:

class Product < ActiveRecord::Base

  def update_stock product
   self.update_attributes!(stock:  stock - 1)
 end
end

答案 3 :(得分:1)

由你决定!

我用来推断如何做事的最简单方法是从modular的角度来看待它。如果你有&#34;沉重的&#34;控制器中的代码,您是否可以在应用的其他区域使用该代码?


Rails是一系列课程&amp;模块

应用程序的不同部分可以访问代码,具体取决于调用的模块。如果您希望在应用程序的不同区域重复使用该方法,您将获益,您应该在模型中包含instance or class method,因为这会将这种方法打开到这些对象

我会使用RSB&amp;提供的代码。 sevenseacat,可能使用decrement!回答中的sevenseacat方法:

self.decrement!(:stock)

关于你的问题,我个人会这样做,但会使它成为一种实例方法。 sevenseacat基本上解释了我的所作所为