rails4自定义验证不起作用

时间:2016-05-20 15:35:14

标签: ruby-on-rails validation activerecord

我有以下设置,无需验证即可正常工作,但我想写一个以确保用户始终与该产品相关联。

所以没有验证一切都没问题。如果我填写产品表单(其余数据)并在控制器中添加此行select m.* from (select m.*, row_number() over (partition by name order by id desc) as seqnum from messages m ) m where seqnum = 1 and price > 0; ,则@product.product_users.build(user_id: current_user.id, role: "owner")及其attrs和Product ProductUseruser_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
    ........

更新

以下验证适用于count。必须通过选择以表格形式选择行业。产品&lt; - &gt;行业设置与产品相同&lt; - &gt;用户。这些在表单中提交的唯一区别。

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

1 个答案:

答案 0 :(得分:4)

在此阶段添加您的product_users.count来电触发数据库查询,相关记录不会 创建。请改用size

相关:ActiveRecord: size vs count