我有一本书模型,书的状态可以是NEW, OLD,VERY_OLD。它可以是新的,旧的或旧的,也可以是旧的和VERY_OLD。我想 将用户选择保存在数据库中。你会如何建议我实施这个?habtm confusion ..逻辑查询
我可以为Book条件创建一个新模型,但我觉得必须有更好的方法。
我有一本书模型,书的状态可以是NEW, OLD,VERY_OLD。它可以是新的,旧的或旧的,也可以是旧的和VERY_OLD。我想 将用户选择保存在数据库中。你会如何建议我实施这个?habtm confusion ..逻辑查询
我可以为Book条件创建一个新模型,但我觉得必须有更好的方法。
如果我明白你的问题吧,有一本书的状态五种可能性:
假设我有这个权利,你可以用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
另一种方式来做到这一点可能是添加布尔列本书叫new
,old
和very_old
,但随后这将需要你要添加一些验证(例如,以确保一本书不能是“新”和“非常旧”)。
好的。这看起来很好。因此,您的意思是:在books表中创建一个状态列,并在books表的状态列中将值保存为“NEW”,“OLD”,“VERY_OLD”,“NEW_OLD”,“NEW_VERY_OLD”,“OLD_VERY_OLD”。之后,在模型中创建枚举(如您所描述的)。并重写它们就像: 'def new?' 'status ==“NEW”||状态==“NEW_OLD”||状态==“NEW_VERY_OLD”' '结束' –
是的,除非您的状态名称应该使用小写值,因为这是Rails/Ruby约定。所以'enum status:[:new ...]',而不是'enum status:[:NEW ...]'。第一个会定义一个名为'new?'的方法,然后第二个会定义一个名为'NEW?'的方法,这不是很传统! Aahaa, – GMA
。这就是我一直在寻找的。 :) –
所以是选项:1)新,2)旧,3)VERY_OLD, 4)NEW&OLD和5)OLD&VERY_OLD? – GMA
对于大型数据集,您是否希望能够轻松找到旧书,旧书,旧书和旧书的书籍? –
你的意思是保存用户在数据库中的选择?用户在表单上做出选择,决定如何存储它们。你想在这里合并两个属性吗?新的,旧的和非常古老的年龄,条件,薄荷,tat,或滥用。 –