2016-05-20 2 views
1

У меня есть следующая настройка, которая отлично работает без проверки, но я хочу написать ее, чтобы убедиться, что пользователь всегда связан с продуктом.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 

ответ

4

Добавить этот этап вашей product_users.count запуска вызова запроса к базе данных и связанные с ним записи не еще создан. Вместо этого используйте size.

Соответствующие: ActiveRecord: size vs count

+0

Фред, это работает, но это супер странно. Я использую count для остальных валидаций, которые работают (вопрос обновлен). Единственная разница в том, что они представлены через форму. Почему это так? –

+0

Ваш вызов reject преобразует ассоциацию в массив. Итак, метод count - это метод из массива. Так что все происходит в памяти ;-) – Fred

+0

Фред, не могли бы вы порекомендовать мне дополнительные ресурсы, кроме предыдущего? Я имею в виду не только разницу между count vs size vs length, но когда я должен использовать, что и почему? Я читал немного об этом раньше, но это всегда о скорости. Так, например, я понятия не имел, что это может быть важно для проверки. –

Смежные вопросы