Rails 模型 if 语句
Rails model if statement
我是 rails 和应用程序开发的新手,所以请原谅任何错误。
我有一个名为 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"
我希望 in_stock 到 return 如果数量大于 1,则为 true,否则为 false。我在 product.rb 文件中编写了以下代码,但当我通过控制台输入产品数量时,它似乎没有执行任何操作。我不确定是否必须 link 数据库列(in_stock 和数量)到 if 语句。或者即使这是处理事情的正确方法。如有任何建议,我将不胜感激。谢谢!
class Product < ActiveRecord::Base
belongs_to :company
def in_stock
if quantity >= 1
in_stock true
else
in_stock false
end
那不是返回真,你可能不小心写了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 的解决方案也有效,但是如果您正在为依赖于存在的布尔值(如您在原始代码中提供的)的东西制作此模型,那么我会坚持使用上面的代码。如果没有,请使用我在此 post 顶部提供的方法,然后删除您的数据库字段。
首先,您不需要数据库中存在布尔字段 in_stock
,因为它可以计算。
方法必须是
def in_stock?
quantity > 0
end
遵循 ruby 约定。并且,如果可以计算,则不要存储它。您将不得不处理陈旧数据的问题。通常,根据经验,尽量避免回调。如果您必须使用它,请确保它正在修改 self
而不是其他对象的状态。
在数据库中存储 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
.
我是 rails 和应用程序开发的新手,所以请原谅任何错误。
我有一个名为 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"
我希望 in_stock 到 return 如果数量大于 1,则为 true,否则为 false。我在 product.rb 文件中编写了以下代码,但当我通过控制台输入产品数量时,它似乎没有执行任何操作。我不确定是否必须 link 数据库列(in_stock 和数量)到 if 语句。或者即使这是处理事情的正确方法。如有任何建议,我将不胜感激。谢谢!
class Product < ActiveRecord::Base
belongs_to :company
def in_stock
if quantity >= 1
in_stock true
else
in_stock false
end
那不是返回真,你可能不小心写了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 的解决方案也有效,但是如果您正在为依赖于存在的布尔值(如您在原始代码中提供的)的东西制作此模型,那么我会坚持使用上面的代码。如果没有,请使用我在此 post 顶部提供的方法,然后删除您的数据库字段。
首先,您不需要数据库中存在布尔字段 in_stock
,因为它可以计算。
方法必须是
def in_stock?
quantity > 0
end
遵循 ruby 约定。并且,如果可以计算,则不要存储它。您将不得不处理陈旧数据的问题。通常,根据经验,尽量避免回调。如果您必须使用它,请确保它正在修改 self
而不是其他对象的状态。
在数据库中存储 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
.