Метод ruby ​​first_or_create не обновляет модель и базу данных

Привет, у меня есть приложение для рельсов, которое содержит модель канала. Его атрибуты следующие:

   # 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» работает. Однако, когда я изменяю некоторые вещи в файле csv и повторяю задачу rake, она должна обновить базу данных с измененным содержимым. Он не делает этого. Мне интересно, это как-то связано с синтаксисом моего метода? часть блока неправильная?


person banditKing    schedule 07.10.2013    source источник
comment
@dax Пожалуйста, прекратите редактировать сообщение спрашивающего, особенно если вы просто удалите благодарность за помощь ...   -  person MrYoshiji    schedule 07.10.2013
comment
Привет, @MrYoshiji, я ухожу с это, которое кто-то процитировал в ответ на редактирование моего собственного вопроса.   -  person dax    schedule 07.10.2013


Ответы (1)


В документации для first_or_create не говорится, что он обновляет запись, если она уже существует. Это

  1. создает запись, если она не существует.
  2. Возвращает запись, если она уже существует

Вам придется обновить его после того, как вы получите запись.

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

ch.update_attribute(:attr, value)
person usha    schedule 07.10.2013
comment
update_attribute: (из документа): Updates a single attribute and saves the record without going through the normal validation procedure => вместо этого используйте update_attributes (во множественном числе), он пройдет процесс проверки - person MrYoshiji; 07.10.2013