雖然這是很有誘惑力的多個值存儲在列,它總是與別人受到傷害結束。你最好建立一個連接表來關聯這些模型。
例如,你可以這樣做:
class DiscussionThread < ActiveRecord::Base
has_many :participations
has_many :participants, :through => :participations
end
class Participation < ActiveRecord::Base
belongs_to :discussion_thread
belongs_to :participant, :class_name => "User", :foreign_key => :user_id
end
class User < ActiveRecord::Base
has_many :participations
has_many :dicussion_threads, :through => :participations
end
這就給了你三個表:
table: discussion_threads
columns: id
table: participations
columns: id | discussion_thread_id | user_id
table: users
columns: id
在其中找到一個用戶正在參與線程,只是做:
@user.discussion_threads
並找到參與線程的用戶:
@discussion_thread.participants
注:Thread
是Ruby的保留字,所以我給它改名DiscussionThread
編輯
心態呈現出如何序列ID,然後查詢的一個陣列的例子反對他們?
你醒來在半夜,和一個陌生的強制的力量下你去你的計算機,並創建這個遷移:
rails g model Abomination horror_ids:text
和型號:
class Abomination < ActiveRecord::Base
serialize :horror_ids
end
你測試它以確保它可以存儲陣列:
@abomination = Abomination.create(:horror_ids=>[2,33,42])
@abomination.horror_ids # => [2,33,42]
所以 什麼?你知道幕後的Rails背後將其轉換爲YAML,它看起來像這樣:
---\n
- 2\n
- 33\n
- 42\n
由奇怪的催促下再次被迫的,你想知道「我怎麼能搜索存儲在該列的特定ID?」。那麼,這只是一個字符串,對吧?你知道如何尋找,在一個文本字段:
cthulhu = 33
Abomination.where(["horror_ids LIKE '%- ?\n%'",cthulhu]).first
隨着越來越多的恐懼,你意識到有人可能會碰到這個絆倒,並認爲它實際上是一個好主意。它必須被摧毀!但你無法鍵入rm -rf *
,而不是怪力,使你考慮怪癖邪神開發商的未來
盲目的跟隨者可能需要知道的,比如
@abomination = Abomination.create
@abomination.horror_ids # => nil
@abomination = Abomination.create(:horror_ids=>[])
@abomination.horror_ids # => []
@abomination = Abomination.create(:horror_ids=>"any string value can go here")
@abomination.horror_ids # => "any string value can go here"
而事實上,串行數據遭到損壞當柱大小太小而無法容納這一切時。
你做了最後一次努力,把電源線拉出來,但已經太晚了,已經控制了你的小竅門,瘋狂的意識在StackOverflow上發佈了代碼,讓整個世界都看到了。最後你陷入困擾的睡眠。第二天,意識到你所犯下的錯誤,你永遠放棄編碼,成爲會計師。
道德
不要這樣做
有人嗎?混淆問題還是? – AnApprentice 2011-02-10 03:26:05