Приложение электронной коммерции Rails 4 с использованием collection_select/select: как правильно реализовать?

У меня есть модель продукта со следующими столбцами:

name:string
price:integer

У меня также есть модель корзины, модель line_item, контроллер заказов: довольно простой, но вы поняли идею.

Что я должен сделать (и сделал), это добавить размер (так как это для футболок) и цвет к модели продукта. Справедливо,

rails g migration AddSizeToProducts size:string

работает просто отлично и аналогично для цвета.

Способ покупки заключается в следующем:

  1. выберите рубашку (одна страница)

  2. после выбора рубашки, вы переходите на следующую страницу

  3. На этой странице вы выберете цвет и размер рубашки.

Из того, что я собрал, используя 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) %>
Другие вопросы по тегам