Несколько внешних ключей, на которые ссылается одна модель Rails - PullRequest
1 голос
/ 28 мая 2009

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

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

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

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 28 мая 2009

HABTM - ваша лучшая ставка. Чтобы ограничить пользователей тремя категориями, добавьте проверку на уровне модели:

class User < ActiveRecord::Base
  has_and_belongs_to_many :categories
  validate :no_more_than_three_categories
protected
  def no_more_than_three_categories
    self.errors.add(:categories, "may not have more than three") if categories.size > 3
  end
end

На ваше усмотрение вытяните магическое число 3 до константы уровня класса или настройки конфигурации.

И не бойся кода. Сделайте это правильно, и код будет вас бояться.

2 голосов
/ 28 мая 2009

С точки зрения удобства сопровождения кода, даже если вы захотите ограничить количество категорий, которые пользователь может выбрать до 3, прямо сейчас, вы можете не захотеть кодировать его с этим ограничением. Вы будете пинать себя позже, когда захотите увеличить его до 5 или уменьшить его до 1. Я бы предложил просто использовать has_and_belongs_to_many с таблицей соединений (вам не нужно :through, потому что из того, что я могу скажем, вам не нужно соединение модель , просто таблица соединения). Использование HABTM автоматически использует таблицу соединений, поэтому вам не нужно беспокоиться о написании кода для этого. Просто убедитесь, что вы правильно назвали объединяющую таблицу и ее столбцы.

Что касается фактического ограничения пользователя только 3 категориями, просто реализуйте это ограничение в представлении / контроллере (то есть ограничьте пользовательский интерфейс, чтобы они не могли выбрать больше 3).

Я уверен, что вы уже прочитали это, но если нет, вот документы для HABTM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...