2015-01-23 9 views
1

Я хочу вставить несколько данных в рельсы. Я использую postgresql, сценарий - это когда он отправляет ему имя клиента, электронную почту и некоторую личную информацию, а затем передают место встречи с датой, а также те удобства, которые они хотят (например, опрос на плавание, бильярдный опрос и т. Д.). В моем внутреннем интерфейсе я запрос:Как я могу вставить данные в рельсы

venue = Venue.find(theVenue_id) 

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

Мой вопрос, как я могу вставить данные в моем amenity_books если были Поживы выбраны?

Я что-то вроде этого.

Я знаю, что это не очень хорошая идея вставить данные, но это был мой последний выбор. Кто-нибудь знает, как вставить несколько данных в 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 

ответ

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, запроса, чтобы найти все выбранные удобства и один ВСТАВИТЬ запрос для каждой выбранной приятности.


Другой вариант заключается в изменении модели данных, делает 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 
+0

Спасибо, сэр. Улучшено ли в моем коде? Это нормально, если вы вставляете данные? –

+0

Я добавил еще одно предложение, не беспокойтесь о производительности слишком много - преждевременная оптимизация - корень всего зла. – sled

+0

'NoMethodError: undefined method' amenity_id = ''У меня ошибка. Должен ли я зацикливать ads_id? –

Смежные вопросы