Приложение электронной коммерции Rails 4 с использованием collection_select/select: как правильно реализовать?
У меня есть модель продукта со следующими столбцами:
name:string
price:integer
У меня также есть модель корзины, модель line_item, контроллер заказов: довольно простой, но вы поняли идею.
Что я должен сделать (и сделал), это добавить размер (так как это для футболок) и цвет к модели продукта. Справедливо,
rails g migration AddSizeToProducts size:string
работает просто отлично и аналогично для цвета.
Способ покупки заключается в следующем:
выберите рубашку (одна страница)
после выбора рубашки, вы переходите на следующую страницу
На этой странице вы выберете цвет и размер рубашки.
Из того, что я собрал, используя select
не будет привязан к базе данных, поэтому я полагаю collection_select
было бы более уместно здесь? Или что-то вроде этого будет хорошо?
<%= select @product, :id, [ ["Small",1], ["Medium",2], ["Large",3]] %>
Кроме того, как бы я "заполнил" эти поля с размерами, т.е. маленькими / средними / большими и цветами, то есть черными / синими / белыми, без привязки их к определенному продукту до выбора продукта (с шага 1 выше)?
Любой вклад по этому вопросу приветствуется.
1 ответ
не связывая их с конкретным продуктом
Это смутило меня - конечно, вы хотите связать поле выбора с опциями конкретного продукта?
Я лично удостоверился бы, что "процесс покупки" настроен, чтобы передать идентификатор продукта повсюду. Я бы сделал это с помощью вложенного ресурса в маршрутах:
#config/routes.rb
resources :products do
get :step2 #-> /products/1/step2
end
Это пройдет params[:product_id]
через процесс, позволяя использовать его на следующем шаге:
#app/controllers/products_controller.rb
def step2
@product = Product.find(params[:product_id])
end
#app/views/products/step2.html.erb
<%= collection_select(:product, :size_id, @product.size, :id, :name, prompt: true) %>
Посмотрев на это, я думаю, что ваша настоящая проблема заключается в хранении ваших size
как струна внутри вашего Product
модель. Я бы сделал отдельную модель под названием sizes
, а затем использовать модель соединения под названием products_sizes
чтобы вы могли связать столько размеров, сколько вам нужно с каждым продуктом. После этого вы сможете вызывать ассоциативные данные
Почему бы не сделать это:
#app/models/product.rb
Class Product < ActiveRecord::Base
has_many :product_sizes
has_many :sizes, through: :product_sizes
end
#app/models/size.rb
Class Size < ActiveRecord::Base
has_many :product_sizes
has_many :products, through: :product_sizes
end
#app/models/product_size.rb
Class ProductSize < ActiveRecord::Base
belongs_to :product
belongs_to :size
end
Это позволяет хранить размеры для разных продуктов, позволяя выбирать идентификаторы из ProductSize
модель, ссылаясь на них непосредственно в вашей модели корзины:
#app/models/cart.rb
Class Cart < ActiveRecord::Base
belongs_to :user
belongs_to :product
belongs_to :product_size
end
#carts
id | user_id | product_id | product_size_id | created_at | updated_at
Это означает, что если вы создадите новый элемент корзины, вы сможете назначить product
"s size
для записи напрямую:
<%= collection_select(:product, :product_size_id, @product.sizes, :id, :name, prompt: true) %>