Хотя соблазнительно хранить несколько значений в столбце, это всегда приводит к тому, что кто-то получает травму. Вам лучше составить объединительный стол, чтобы связать модели.
Например, вы можете сделать это:
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
EDIT
Не могли бы вы показать пример сериализации массива идентификаторов и последующего запроса к ним?
Вы просыпаетесь среди ночи, и под властью странного принуждения вы идете на свой компьютер и создаете эту миграцию:
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
Опять побуждаемый этим странным побуждением, вы задаетесь вопросом «Как я могу найти конкретный идентификатор, хранящийся в этом столбце?». Ну, это просто строка, верно? Вы знаете, как найти это в текстовом поле:
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 для просмотра всем миром. Наконец вы впадаете в беспокойный сон. На следующий день, понимая, что вы совершили, вы навсегда отказались от написания кода и стали бухгалтером.
Мораль
Не делай этого