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")

Рейк задача в моето приложение е прочела 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 файла и да попълни базата данни, частта "create" на метода "first_or_create" работи. Въпреки това, когато променя някои неща в csv файла и повторя задачата за рейк, тя трябва да актуализира базата данни с промененото съдържание. Не прави това. Чудя се дали има нещо общо със синтаксиса на моя метод? грешна ли е блоковата част?


person banditKing    schedule 07.10.2013    source източник
comment
@dax Моля, спрете да редактирате публикацията на asker, особено ако просто премахнете частите с благодарности за вашата помощ ...   -  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