我是rails和app开发的新手,所以请原谅任何错误。
我有一个名为Product的模型,它具有以下(模式):
t.string "name"
t.integer "cost"
t.boolean "in_stock"
t.datetime "sold_date"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "quantity"
如果数量大于1,我希望in_stock返回true,否则返回false。我在product.rb文件中编写了以下代码,但是当我通过控制台输入产品数量时,它似乎没有做任何事情。我不确定是否必须将数据库列(in_stock和quantity)链接到if语句。或者,即使这是正确的事情。对任何建议我都很感激。谢谢!
class Product < ActiveRecord::Base
belongs_to :company
def in_stock
if quantity >= 1
in_stock true
else
in_stock false
end
答案 0 :(得分:1)
对于初学者,您不需要在数据库中存在布尔字段in_stock
,因为它可以计算。
该方法必须
def in_stock?
quantity > 0
end
遵循ruby惯例。并且,如果可以计算,请不要存储它。您将不得不处理陈旧数据的问题。通常,根据经验,尽量避免回调。如果必须使用它,请确保它正在修改self
的状态,而不是其他对象。
答案 1 :(得分:1)
在数据库中同时存储quantity
和in_stock
可能会导致数据不一致:
+----+----------+----------+
| id | in_stock | quantity |
+----+----------+----------+
| 1 | true | 0 |
| 2 | false | 15 |
+----+----------+----------+
我会根据数量计算in_stock
并为查询使用额外的scope:
class Product < ActiveRecord::Base
scope :in_stock, -> { where('quantity > 0') }
def in_stock?
quantity > 0
end
end
此外,您应确保quantity
的默认值为0
且不能为NULL
。
答案 2 :(得分:0)
那不是真的,你可能不小心写了in_stock true
。尝试将其更改为:
def in_stock?
quantity > 0
end
编辑:看起来你想要实际设置in_stock变量。你可以尝试类似的东西:
class Product < ActiveRecord::Base
after_update :update_in_stock
def update_in_stock
if quantity > 0
in_stock = true
end
end
end
编辑:bsvin33t的解决方案也可以使用,但是如果你为依赖于布尔值存在的东西制作这个模型(正如你在原始代码中提供的那样),那么我会坚持使用上面的代码。如果没有,那么使用我在本文顶部提供的方法,只需删除您的数据库字段。