ruby first_or_create方法不更新模型&数据库

时间:2013-10-07 14:22:18

标签: ruby-on-rails csv model rake updatemodel

您好我有一个包含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任务时,它应该使用更改的内容更新数据库。它没有这样做。我想知道它与我的方法的语法有关吗?块部分错了吗?

1 个答案:

答案 0 :(得分:0)

first_or_create的文档并未说明如果记录已存在则会更新记录。它

    如果记录不存在,则
  1. 创建记录。
  2. 返回记录(如果已存在)
  3. 获得记录后,您必须更新它。

    ch = Channel.where(:channel_name =>"#{channelName}").first_or_create do |c|
       c.ownership = "#{owner}"
       c.classification = "#{classif}"
    end
    
    ch.update_attribute(:attr, value)