Я хотел бы ограничить количество элементов в ассоциации.Я хочу убедиться, что у пользователя не больше X вещей.Этот вопрос был задан ранее , и у решения была логика у ребенка:
Предлагаемое решение (для аналогичной проблемы):
class User < ActiveRecord::Base
has_many :things, :dependent => :destroy
end
class Thing <ActiveRecord::Base
belongs_to :user
validate :thing_count_within_limit, :on => :create
def thing_count_within_limit
if self.user.things(:reload).count >= 5
errors.add(:base, "Exceeded thing limit")
end
end
end
Жестко закодировано "5"это проблема.Мой лимит меняется в зависимости от родителя.Коллекция вещей знает свои ограничения по отношению к пользователю.В нашем случае, менеджер может регулировать лимит (вещей) для каждого пользователя, поэтому пользователь должен ограничить сбор своих вещей.Мы могли бы сделать thing_count_within_limit запросить ограничение у его пользователя:
if self.user.things(:reload).count >= self.user.thing_limit
Но, это очень много пользовательских самоанализа от Thing.Многократные обращения к пользователю и, в особенности, то, что (:reload)
для меня - красные флаги.
Мысли о более подходящем решении:
Я думал, что has_many :things, :before_add => :limit_things
будет работать, но мы должны поднятьисключение остановка цепи .Это заставляет меня обновлять thing_controller для обработки исключений вместо соглашения rails if valid?
или if save
.
class User
has_many :things, :before_add => limit_things
private
def limit_things
if things.size >= thing_limit
fail "Limited to #{thing_limit} things")
end
end
end
Это Рельсы.Если мне нужно усердно работать, я, вероятно, что-то делаю не так.
Чтобы сделать это, мне нужно обновить родительскую модель, контроллер ребенка, И я не могу следовать соглашению?Я что-то пропустил?Я неправильно использую has_many, :before_add
?Я искал пример с использованием: before_add, но не смог его найти.
Я думал о переносе проверки на Пользователь, но это происходит только при сохранении / обновлении Пользователем.Я не вижу способа использовать его, чтобы остановить добавление Thing.
Я предпочитаю решение для Rails 3 (если это имеет значение для этой проблемы).