我有一本書模型,書的狀態可以是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,或濫用。 –