habtm confusion ..逻辑查询

时间:2015-05-04 09:43:10

标签: mysql ruby-on-rails

我有一本书模型,书的状态可以是新的, 老,非常。它既可以是NEW,也可以是OLD,也可以是OLD和VERY_OLD。我想要 保存数据库中的用户选择。你会怎么建议我实现这个?

我可以为Book条件创建一个新模型,但我觉得必须有更好的方法。

1 个答案:

答案 0 :(得分:3)

如果我理解你的问题,那么一本书的状态有五种可能性:

  1. NEW
  2. OLD
  3. VERY_OLD
  4. NEW& OLD
  5. OLD& VERY_OLD
  6. 假设我已经做到了,你可以通过ActiveRecord::Enum完成这项工作。这只需要向您的数据库添加一个新列,并且不需要新模型。

    如果您还没有列,请先添加status列:

    # In a migration
    add_column :books, :status, :integer
    add_index :books, :status
    

    (如果您不希望某本书具有状态,则可能还需要将null: false添加到行add_column。)

    然后将其添加到您的Book模型中:

    class Book < ActiveRecord::Base
    
      enum status: [:new, :old, :very_old, :new_and_old, :old_and_very_old]
    
    end
    

    这会在Book上生成名为new?old?very_old?等的方法。您可能希望覆盖这些方法。因此,如果状态为new?以及new_and_old,则new会返回true:

    def new?
      status == "new" || status == "new_and_old"
    end
    

    另一种方法是将boolean列添加到名为newoldvery_old的书中,但这需要您添加一堆验证(例如确保一本书不能同时“新”和“非常旧”。)