Правильный дизайн: сообщение может иметь одного пользователя (автора) плюс много пользователей (отмеченных пользователей) - PullRequest
1 голос
/ 05 октября 2011

У меня есть ситуация, когда я немного застреваю.

Сообщение может иметь пользователя (как автора), а сообщение может иметь много пользователей (поскольку в сообщении могут быть отмечены другие пользователи).

В моем посте модель:

belongs_to :user
has_and_belongs_to_many :users

В моей модели пользователя:

has_and_belongs_to_many :posts

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

Каким должен быть правильный дизайн? Возможно, заменить user_id в сообщении на author_id?

1 Ответ

1 голос
/ 05 октября 2011

Я могу себе представить, User и Users испортят ваши соединения.Но учтите, что, насколько мне известно, это то, что рельсы не решают хорошо.Простое переименование его author (при этом улучшая читаемость / лучше выражая намерение) не поможет, поскольку оно все равно будет указывать на ту же таблицу users.

При выполнении нескольких соединений с рельсами очень трудно правильно выразить ваши условия.Rails создает псевдонимы для ваших таблиц на лету, к сожалению, я не нашел способа обратиться к этим псевдонимам в моих условиях.

Так что я думаю, что вам придется либо использовать sql ручной работы (который будет быстрым), либо использовать rails, и сначала сортировать сообщения по имени автора, а затем извлекать список отмеченных пользователей для каждого сообщения.второй (который будет медленнее, но чистый рубин).

Сначала я выбрал бы второй вариант и при необходимости оптимизировал бы его до первого.

[ОБНОВЛЕНИЕ: добавить определение области]

Лично я не одобряю default_scope и вместо этого предложил бы определить явную область действия

scope :with_authors_sorted, lambda { 
  Post.includes(:type).includes(:user).
       order('year DESC, week DESC, users.display_name ASC, posts.created_at DESC') 
}

, которую вы затем можете просто использовать в своем контроллере.

@posts = Post.with_authors_sorted

Надеюсь, это поможет.

...