我有一个rails系统,用户输入了现有数据,在某些情况下,他们犯了一些错误,创建了两次类似名称的记录。
我实际上不允许内容重复(同名和分配),这可能就是它无效的原因。
我有2个型号:
:question
belongs_to :content
:content
has_many :questions
belongs_to assignature
如果在更新名称字段后找到现有记录,我需要做的是合并2条记录。
即。
内容A. name =“这是一个测试”
内容B. name =“这是测试”
我想将内容A重命名为name =“This is test”,合并record.questions,并销毁内容A.
更新
感谢@Thomas R. Koll我将逻辑移到控制器上,现在情况正在发挥作用,但我不得不做出一个奇怪的解决方法来绕过我的唯一性限制。
contents_controller
def_update
existent = Content.where(nombre: params[:content][:nombre]).where(assignature_id: params[:content][:assignature_id])
if existent.present?
@content.questions.update_all(content_id: existent.first.id)
#if params nombre is equals to existent , model wont update
params[:content][:nombre] = "dummy"
end
...
content.rb
after_update :clean_empty_contents
def clean_empty_contents
#delete if content has no questions (applies to my system)
Content.includes(:questions).where(questions: {id: nil}).destroy_all
end
我正在尝试使用此代码但未成功:
content.rb
validates :nombre, uniqueness: { scope: [:assignature_id], :case_sensitive => false}
before_update :correction
def correction
existent = Content.find_by(nombre: self.nombre, assignature: self.assignature).first
if existent
existent.questions = existent.questions + self.questions
self.destroy
end
end
答案 0 :(得分:0)
根据经验,尝试使用correction
方法更明确,并将要合并的对象传递给它。为什么?因为您可能恰好在该对象上并尝试与自身合并。知道了吗?
虽然我们在此,但merge_into!
比correction
更好地描述了它。加!因为你正在摧毁一些东西。
def merge_into!(other)
# this faster than loading other.questions
questions.update_all(content_id: other.id)
# Some safety check would be nice, even better, look into Paranoia.
self.destroy
end