У меня есть следующая настройка, которая отлично работает без проверки, но я хочу написать ее, чтобы убедиться, что пользователь всегда связан с продуктом.rails4 пользовательский валидация не работает
Так что без проверки все в порядке. Если я заполняю свою форму (для остальной информации) и добавляю эту строку @product.product_users.build(user_id: current_user.id, role: "owner")
в контроллер, то сохраняются как Product
с ее attrs, так и ProductUser
с user_id: current_user.id
и role: "owner"
. Но если я добавлю следующую проверку, то продукт не будет создан и говорит, что проверка не проходит. («Пользователь не связан с пользователем»)!
def product_users_limit(min: 1)
if product_users.count < min
errors.add :base, "There is no user associated!"
end
end
Что не так с этой проверкой?
модели
User has_many :products, through: :product_users
User has_many :product_users
Product has_many :users, through: :product_users
Product has_many :product_users
ProductUser belongs_to :user
ProductUser belongs_to :product
product_users стол
create_table "product_users", force: :cascade do |t|
t.integer "user_id", null: false
t.integer "product_id", null: false
t.string "role", null: false
end
изделия контроллер
def create
@product = Product.new(product_params)
@product.product_users.build(user_id: current_user.id, role: "owner")
authorize @product
if @product.save
........
UPDATE
Следующая проверка работы со счетом. Отрасли должны выбираться в форме с помощью select. Продукт < -> отраслевая настройка такая же, как продукт < -> пользователь. Единственная разница в том, что они представлены в форме.
def product_industries_limit(max: 5, min: 1)
if industries.reject(&:marked_for_destruction?).count > max
errors.add :base, "You can't choose more than #{pluralize(max, 'industry')}."
elsif industries.reject(&:marked_for_destruction?).count < min
errors.add :base, "You have to choose at least #{pluralize(min, 'industry')}."
end
end
Фред, это работает, но это супер странно. Я использую count для остальных валидаций, которые работают (вопрос обновлен). Единственная разница в том, что они представлены через форму. Почему это так? –
Ваш вызов reject преобразует ассоциацию в массив. Итак, метод count - это метод из массива. Так что все происходит в памяти ;-) – Fred
Фред, не могли бы вы порекомендовать мне дополнительные ресурсы, кроме предыдущего? Я имею в виду не только разницу между count vs size vs length, но когда я должен использовать, что и почему? Я читал немного об этом раньше, но это всегда о скорости. Так, например, я понятия не имел, что это может быть важно для проверки. –