Создайте таблицу с полем User_ids, а затем запросите определенный идентификатор - PullRequest
1 голос
/ 10 февраля 2011

Мне нужна помощь в создании таблицы и получении данных из этой таблицы в Rails 3.

Вот разбивка:

Модели - здесь задействованы 3 модели:

  • В теме много участников
  • Участники принадлежат теме
  • Пользователи

Таблица активности:

id | thread_id | participants

Пример записи будет выглядеть примерно так:

1 | 300 | 3,1,5,67,13
2 | 333 | 3,12
3 | 433 | 1,12
4 | 553 | 1,12, 67

Где участники, это список user_ids, если есть лучший способ сохранить user_ids, пожалуйста, дайте мне знать. Я еще не построил это.

После того, как я заполню таблицу активности. Затем я хочу иметь возможность запрашивать в соответствии с: Выберите все записи активности, где member_id из 67 включен в поле участников.

Я надеюсь, что все ясно, если нет, пожалуйста, дайте мне знать. Идеи? Мысли? Предложения.

Спасибо

1 Ответ

5 голосов
/ 10 февраля 2011

Хотя соблазнительно хранить несколько значений в столбце, это всегда приводит к тому, что кто-то получает травму. Вам лучше составить объединительный стол, чтобы связать модели.

Например, вы можете сделать это:

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 для просмотра всем миром. Наконец вы впадаете в беспокойный сон. На следующий день, понимая, что вы совершили, вы навсегда отказались от написания кода и стали бухгалтером.

Мораль

Не делай этого

...