Наилучшая практика для ограничения количества ассоциаций внутри отношения has_many? - PullRequest
4 голосов
/ 15 ноября 2008

Скажите, что у меня есть две модели: пользователи и учетные записи. С каждой учетной записью может быть связано не более n пользователей, а пользователь может быть связан только с одной учетной записью.

Казалось бы, естественно, что пользователь

belongs_to :account

и Аккаунт

has_many :users

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

Я подозреваю, что ответом будет что-то вроде: before_add. Однако такой подход, по-видимому, применим только к ассоциациям, созданным с помощью <<. Так что он будет вызван, когда вы использовали </p>

@account.users << someuser 

но не если вы использовали

@account.users.create

Я также считал, что может быть более практичным реализовать ограничение с использованием before_save в модели User, но, похоже, было бы немного неприемлемо реализовать бизнес-правила Account в модели User.

Какова наилучшая практика для ограничения количества ассоциаций?

Редактировать: n пользователей на учетную запись - это некоторые бизнес-данные, которые хранятся в отдельных учетных записях, а не просто магическое число, которое в коде будет суетиться.

Ответы [ 2 ]

6 голосов
/ 15 ноября 2008

Сначала, если в вашей таблице пользователей есть внешний ключ account_id, вам нужно использовать

class User
  belongs_to :account
end

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

Если вы хотите ограничить эту учетную запись, например, максимум 3 пользователя, тогда вы можете определить следующую проверку:

class User
  validates_each :account do |user, attr, value|
    user.errors.add attr, "too much users for account" if user.account.users.size >= 3
  end
end

и в результате вы не сможете создать нового пользователя для учетной записи, если в учетной записи уже есть 3 пользователя.

2 голосов
/ 15 ноября 2008

Я думаю, что ваше правило подчиняется другой интерпретации. Думайте о правиле как о «Вы не можете добавить пользователя в учетную запись, в которой уже есть 3 пользователя». Теперь, когда это пользовательское правило, его реализация на пользовательском объекте кажется совершенно естественной, и решения @ Raimond будет достаточно.

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

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