Rails建模if语句

时间:2015-04-10 04:30:25

标签: ruby-on-rails ruby if-statement model

我是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 

3 个答案:

答案 0 :(得分:1)

对于初学者,您不需要在数据库中存在布尔字段in_stock,因为它可以计算。

该方法必须

def in_stock?
  quantity > 0
end

遵循ruby惯例。并且,如果可以计算,请不要存储它。您将不得不处理陈旧数据的问题。通常,根据经验,尽量避免回调。如果必须使用它,请确保它正在修改self的状态,而不是其他对象。

答案 1 :(得分:1)

在数据库中同时存储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

答案 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的解决方案也可以使用,但是如果你为依赖于布尔值存在的东西制作这个模型(正如你在原始代码中提供的那样),那么我会坚持使用上面的代码。如果没有,那么使用我在本文顶部提供的方法,只需删除您的数据库字段。