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 而不是其他对象的状态。

在数据库中存储 quantityin_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.