通过CSV导入到Rails时没有方法

时间:2015-06-16 10:44:22

标签: ruby-on-rails ruby

我通过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!

当我运行导入时,我收到以下错误:

  

未定义的方法`contact ='对于#

联系人属于酒店酒店 has_many 联系人。我使用应用程序创建了联系人,但我正在努力使用此导入方法使其工作。我不确定我在这里做错了什么,因为导入后地图和应用程序模型都被创建(带有酒店的ID)。当我包含与 contact_name 相关的代码时,导入现在失败。

class Contact < ActiveRecord::Base
    belongs_to :hotel
end

class Hotel < ActiveRecord::Base
    has_many :contacts  
end

2 个答案:

答案 0 :(得分:1)

您应该使用<<运算符,因为它是复数关联:

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

请注意,我从参数中删除了:hotel_id键,因为它是冗余的(它已经通过关联设置)。

您也可以从关联的另一端开始:

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

答案 1 :(得分: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"]