给定多个条目的哈希值更新activerecord关系

给定多个条目的哈希值更新activerecord关系,activerecord,ruby-on-rails-4,Activerecord,Ruby On Rails 4,我对Rails还很陌生,所以要温柔:) 我有以下模型设置: class User has_many :it_certificates, :class_name => 'UserCertificate' class UserCertificate belongs_to :skill 给定以下输入(JSON) 更新关系it\U证书信息的最简单方法是什么 我一直想更新_all,但它不符合我的需要(它只更新具有相同值的给定字段) 因此,我一直在努力尝试迭代每个记录,然后逐个更新它们

我对Rails还很陌生,所以要温柔:)

我有以下模型设置:

class User
   has_many :it_certificates, :class_name => 'UserCertificate'

class UserCertificate
   belongs_to :skill
给定以下输入(JSON)

更新关系it\U证书信息的最简单方法是什么

我一直想更新_all,但它不符合我的需要(它只更新具有相同值的给定字段)

因此,我一直在努力尝试迭代每个记录,然后逐个更新它们。 我的意思是挣扎,因为在我看来,当Rails的想法与之相反时,我需要关心很多事情


提前谢谢

现在,我的解决方案是:

  def self.update_from_hash(data, user_id)
    self.transaction do
      data.each do |certificate|
        if certificate[:id] == nil
          # create
          if !self.create(
             :name => certificate[:name],
             :entity => certificate[:entity],
             :user_id => user_id,
             :non_it => certificate[:non_it],
             :skill_id => certificate[:skill][:id],
             :date => self.build_date_from_items(certificate[:date_items][:month], certificate[:date_items][:year])
          )
            raise ActiveRecord::Rollback
          end
        else
          # update
          if !self.update(certificate[:id], {
              :name => certificate[:name],
              :entity => certificate[:entity],
              :non_it => certificate[:non_it],
              :skill_id => certificate[:skill][:id],
              :date => self.build_date_from_items(certificate[:date_items][:month], certificate[:date_items][:year])
          })
            raise ActiveRecord::Rollback
          end
        end
      end
    end
    return true
  end
这是可行的,但我仍然期待一个更优雅的解决方案:)

  def self.update_from_hash(data, user_id)
    self.transaction do
      data.each do |certificate|
        if certificate[:id] == nil
          # create
          if !self.create(
             :name => certificate[:name],
             :entity => certificate[:entity],
             :user_id => user_id,
             :non_it => certificate[:non_it],
             :skill_id => certificate[:skill][:id],
             :date => self.build_date_from_items(certificate[:date_items][:month], certificate[:date_items][:year])
          )
            raise ActiveRecord::Rollback
          end
        else
          # update
          if !self.update(certificate[:id], {
              :name => certificate[:name],
              :entity => certificate[:entity],
              :non_it => certificate[:non_it],
              :skill_id => certificate[:skill][:id],
              :date => self.build_date_from_items(certificate[:date_items][:month], certificate[:date_items][:year])
          })
            raise ActiveRecord::Rollback
          end
        end
      end
    end
    return true
  end