假设我有产品型号(app/models/product.rb
),并且模型中有以下方法def。
def update_stock product
product.stock -= 1
product.save(:validation => false)
end
这可以接受吗?
提前致谢。
答案 0 :(得分:3)
将数据库操作和应用程序的业务逻辑保留在模型中是一种很好的做法。 Model使用ORM(对象关系映射)直接与数据库交互。同样在rails中,约定控制器应该很薄,模型应该很胖。这个答案详细解释了它
答案 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
基本上解释了我的所作所为