给定多个条目的哈希值更新activerecord关系
我对Rails还很陌生,所以要温柔:) 我有以下模型设置:给定多个条目的哈希值更新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,但它不符合我的需要(它只更新具有相同值的给定字段) 因此,我一直在努力尝试迭代每个记录,然后逐个更新它们
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