如何在rails中多次插入数据

时间:2015-01-23 03:37:39

标签: ruby-on-rails postgresql ruby-on-rails-4 associations

我想在rails中插入多个数据。我使用postgresql,情节是当表单提交它通过客户名称,电子邮件和一些个人信息,然后也通过欲望的地点与日期和他们想要的设施(例如游泳民意调查,台球民意调查和等等。)。在我的后端,我将查询:

venue = Venue.find(theVenue_id)

book = venue.books.new(name: client_name, email: client_email and etc)

我的问题是,如果选择了许多便利设施,我如何在我的amenity_books中插入数据?

我喜欢这样的事情。

ex. amenities_id_choosen = [1,3]
if book.save
   amenities_id_choosen.each do |x|
    amenity = Amenitiy.find(x)
    amenity_book = amenity.amenity_books.create(venue_id: venue.id)
end

我知道插入数据不是一个好主意,但这是我的最后选择。是否有人知道如何在2个模型中插入具有不同数据的多个数据。

模型

class Amenity < ActiveRecord::Base
    has_many :categorizations
    has_many :venues, through: :categorizations

    has_many :amenity_books
    has_many :books, through: :amenity_books
end

class Venue < ActiveRecord::Base
    has_many :categorizations
    has_many :amenities, through: :categorizations
end

class Categorization < ActiveRecord::Base
    belongs_to :venue
    belongs_to :amenity
end

class Book < ActiveRecord::Base
    belongs_to :venue
end

class AmenityBook < ActiveRecord::Base
    belongs_to :amenity
    belongs_to :venue
    belongs_to :book
end

1 个答案:

答案 0 :(得分:0)

这是一个改进版本:

amenities_id_choosen = [1,3]

if book.save
  Amenitiy.find(amenities_id_choosen).each do |amenity|
    amenity.amenity_books.create(venue_id: venue.id)
  end
end

这将导致一个SELECT查询找到所有选定的便利设施,并为每个选定的便利设施提供一个INSERT查询。


另一种选择是改变你的数据模型,AmenityBook真的需要有一个场地吗?因为看起来场地已经通过Book模型定义。

这是一个建议:

class Book < ActiveRecord::Base
    belongs_to :venue
    has_many :amenity_books
    has_many :amenities, through: :amenity_books
end

class AmenityBook < ActiveRecord::Base
    belongs_to :amenity
    belongs_to :book
    has_one :venue, through: :book
end

使用许多便利设施创建预订的代码:

amenities_id_choosen = [1,3]
book.amenity_ids = amenities_id_choosen

if book.save
  # success !
end