2015-05-04 88 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

。這就是我一直在尋找的。 :) –