您好我有一个包含Channel模型的rails应用程序。其属性如下:
# Table name: channels
#
# id :integer not null, primary key
# created_at :datetime
# updated_at :datetime
# channel_name :string(255)
# classification :string(255) default("0")
# ownership :string(255) default("0")
我的应用中的rake任务已读取csv文件并在数据库中填充了信息。这是创建模型的代码的快照
...previous code........
channelName = nil
classif = nil
owner = nil
channelName = row[0].force_encoding('UTF-8')
classif = row[1].force_encoding('UTF-8')
owner = row[2].force_encoding('UTF-8')
if (channelName.nil?)
puts "Channel name for row #{i} was nil"
next
else
puts "Creating channel hash with information:"
puts "channel_name= #{channelName}"
puts "classification=#{classif}"
puts "ownership= #{owner}"
ch = Channel.where(:channel_name =>"#{channelName}").first_or_create do |c|
c.ownership = "#{owner}"
c.classification = "#{classif}"
由于任务能够读取csv文件并填充数据库,因此“first_or_create”方法的“create”部分可以正常工作。但是,当我更改csv文件中的某些内容并重做rake任务时,它应该使用更改的内容更新数据库。它没有这样做。我想知道它与我的方法的语法有关吗?块部分错了吗?
答案 0 :(得分:0)
first_or_create的文档并未说明如果记录已存在则会更新记录。它
获得记录后,您必须更新它。
ch = Channel.where(:channel_name =>"#{channelName}").first_or_create do |c|
c.ownership = "#{owner}"
c.classification = "#{classif}"
end
ch.update_attribute(:attr, value)