2013-10-07 4 views
1

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

+0

@dax Пожалуйста, прекратите редактировать запись Аскера, особенно если вы просто удалите «спасибо за вашу помощь» часть ... – MrYoshiji

+0

Hi @MrYoshiji, я уходящий из [этого] (Http: // меты. stackexchange.com/questions/122535/what-is-the-etiquette-for-adding-a-signature-to-a-question), которые кто-то цитировал в ответ на редактирование моего собственного вопроса. – dax

ответ

0

В документации для 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) 
+1

update_attribute: (from doc): «« Обновляет один атрибут и сохраняет запись без прохождения обычной процедуры проверки »;> вместо этого использует« update_attributes »(множественное число), он будет проходить процесс проверки – MrYoshiji