Rails accepted_nested_attributes_for验证

时间:2014-08-14 18:19:54

标签: ruby-on-rails validation activerecord

Image has_many :categories。 它也是ccepts_nested_attributes_for :categoriesCategories只有iddescription。我想要验证类别before_create,而不是创建具有相同描述的重复类别,以便如果用户输入的category已经存在,则只需将category设置为{已存在的{1}}。

我尝试向categoryImage class添加挂钩,但似乎都没有改变Category class以便通过验证。

以下是我尝试过的内容(在CategoryImage class上添加此内容):

Category class

2 个答案:

答案 0 :(得分:0)

可能不是最好的解决方案,但它应该让你开始。

# Get the value of the category_description from the form
@category_description = params[:image][:category_attributes][:description]

# check if it already exists
if Category.exists?(description: @category_description)
  # if it exists then find the category and pass it to the image
  @existing_category = Category.where(description: @category_description).first

  @image = Image.new(image_params.merge({ category: @existing_category }))
else
  # if not, create a new image and category
  @image = Image.new(image_params)
end

有几种方法可以找到现有的类别,但这应该可以帮到你!

答案 1 :(得分:0)

可以在关联上使用钩子,la:

has_many :categories, after_add: :chk_category

每次将类别添加到Image时都会调用chk_category方法,因此,您可以执行以下操作:

def chk_user(category)
  exist_category = Category.where(title: category.title).first
  if exist_category
    self.categories = self.categories + [exist_category]
    self.categories = self.categories - [category]
  end
end

你会想在这里写一些测试,以确保你避免递归等,但我认为钩子应该有所帮助。