Rails修正模型级记录中的拼写错误

时间:2017-04-24 05:52:09

标签: ruby-on-rails

我有一个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

1 个答案:

答案 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