2015-06-16 2 views
0

Я импортирую в свое приложение Rails через CSV. Импорт работал до тех пор, пока я не попытался создать новый контакт, используя один из столбцов моего CSV. Вот код, который импортирует данные:Нет метода при импорте в Rails через CSV

row = Hash[[header, spreadsheet.row(i)].transpose] 

    hotel = find_by_id(row["id"]) || new 
    hotel.attributes = row.to_hash.select { |k,v| allowed_attributes.include? k } 

    hotel_name = row["hotel_title"] 
    hotel_id = row["id"] 

    if row.to_hash["contact_name"] 
     hotel.contact = Contact.create(:hotel_id => row["id"], :name => row["contact_name"]) 
    end 

    hotel.map = Map.create(:hotel_id => row["id"], :status => 0, :title => "Map Publication for #{hotel_name}") 
    hotel.app = App.create(:hotel_id => row["id"], :status => 0, :title => "Bespoke App for #{hotel_name}") 

    hotel.save! 

Когда я запускаю импорт, я получаю следующее сообщение об ошибке:

undefined method `contact=' for #

В Контакты принадлежат отеля, и Отель has_many Контакты. Я создал Контакты с помощью приложения, но я изо всех сил пытаюсь заставить его работать с использованием этого метода импорта. Я не уверен, что я делаю неправильно здесь, так как модели Map и App одновременно создаются (с идентификатором отеля) после импорта. Импорт теперь терпит неудачу, когда я включаю код, относящийся к contact_name.

class Contact < ActiveRecord::Base 
    belongs_to :hotel 
end 

class Hotel < ActiveRecord::Base 
    has_many :contacts 
end 

ответ

1

Вы должны использовать << оператора, так как это множественное объединение:

hotel.contacts << Contact.create(name: row['contact_name']) 

Обратите внимание, что я удалил :hotel_id ключ из параметров, как это было бы излишним (это уже установлено через ассоциацию).

Вы можете сделать это также с другого конца ассоциации:

Contact.create(name: row['contact_name'], hotel: hotel) 
0

Просто удалите hotel.contact =. Это вам не нужно, так как вы явно предоставляете :hotel_id при создании записи контакта.

Итак, вам нужно заменить

if row.to_hash["contact_name"] 
     hotel.contact = Contact.create(:hotel_id => row["id"], :name => row["contact_name"]) 
    end 

с

Contact.create(:hotel_id => row["id"], :name => row["contact_name"]) if row.to_hash["contact_name"] 
Смежные вопросы