我有以下设置,无需验证即可正常工作,但我想写一个以确保用户始终与该产品相关联。
所以没有验证一切都没问题。如果我填写产品表单(其余数据)并在控制器中添加此行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
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
........
更新
以下验证适用于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
答案 0 :(得分:4)
在此阶段添加您的product_users.count
来电触发数据库查询,相关记录不会 创建。请改用size
。