2015-05-04 86 views
0

我有一本书模型,书的状态可以是NEW, OLD,VERY_OLD。它可以是新的,旧的或旧的,也可以是旧的和VERY_OLD。我想 将用户选择保存在数据库中。你会如何建议我实施这个?habtm confusion ..逻辑查询

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

+0

所以是选项:1)新,2)旧,3)VERY_OLD, 4)NEW&OLD和5)OLD&VERY_OLD? – GMA

+0

对于大型数据集,您是否希望能够轻松找到旧书,旧书,旧书和旧书的书籍? –

+0

你的意思是保存用户在数据库中的选择?用户在表单上做出选择,决定如何存储它们。你想在这里合并两个属性吗?新的,旧的和非常古老的年龄,条件,薄荷,tat,或滥用。 –

回答

3

如果我明白你的问题吧,有一本书的状态五种可能性:

  1. OLD
  2. VERY_OLD
  3. 新& OLD
  4. OLD & VERY_OLD

假设我有这个权利,你可以用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 

这会在书上生成名为new?,old?,very_old?等的方法。您可能想要覆盖这些方法,例如所以new?返回true,如果状态new_and_old以及刚刚new

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

另一种方式来做到这一点可能是添加布尔列本书叫newoldvery_old,但随后这将需要你要添加一些验证(例如,以确保一本书不能是“新”和“非常旧”)。

+0

好的。这看起来很好。因此,您的意思是:在books表中创建一个状态列,并在books表的状态列中将值保存为“NEW”,“OLD”,“VERY_OLD”,“NEW_OLD”,“NEW_VERY_OLD”,“OLD_VERY_OLD”。之后,在模型中创建枚举(如您所描述的)。并重写它们就像: 'def new?' 'status ==“NEW”||状态==“NEW_OLD”||状态==“NEW_VERY_OLD”' '结束' –

+0

是的,除非您的状态名称应该使用小写值,因为这是Rails/Ruby约定。所以'enum status:[:new ...]',而不是'enum status:[:NEW ...]'。第一个会定义一个名为'new?'的方法,然后第二个会定义一个名为'NEW?'的方法,这不是很传统! Aahaa, – GMA

+0

。这就是我一直在寻找的。 :) –