Как создать выделенные области одного и того же отношения has_many через - PullRequest
0 голосов
/ 24 января 2020

Я работаю над разделом администрирования продукта. У меня есть productvariants, в котором может быть от productattributevalues до productvariantdetails.

productattributevalues (зеленый, желтый, S, XL) принадлежит_1007 * (цвет, размер и материал).

Я хотел бы иметь два отдельных селектора на моем productvariants/_form, где я могу выбрать (опционально), если productvariant имеет productattributevalue типа productattribute: применен размер или цвет.

Я изменил свои модели и ввел два псевдонима для productattributevalues. Один для каждого атрибута.

class Productvariant < ActiveRecord::Base
  attr_accessible :productattributesizes, :productattributecolors

  has_many :productattributevalues
  has_many :productvariantdetails
  has_many :productattributevalues, :through => :productvariantdetails
  has_many :productattributecolors, :through => :productvariantdetails, :source => :productattributevalue
  has_many :productattributesizes, :through => :productvariantdetails, :source => :productattributevalue
  accepts_nested_attributes_for :productvariantdetails, :allow_destroy => true
end

class Productattributevalue < ActiveRecord::Base
  attr_accessible :value, :productattribute_id
  scope :product_color, joins(:productattribute).where('productattributes.attributename' => 'color')
  scope :product_size, joins(:productattribute).where('productattributes.attributename' => 'size')

  belongs_to :productattribute
end

Это мое мнение

<%= form_for [:admin, @productvariant], :html => {'role' => 'form' } do |f| %>
    .
    .
    .
  <%= f.select(:productattributecolors, Productattributevalue.product_color.uniq.order('id asc').map{|s| [s.value, s.id]}, {:selected => params[:productattributecolor], :include_blank => false, :prompt => "Select color"}, {}) %>
  <%= f.select(:productattributesizes, Productattributevalue.product_size.uniq.order('id asc').map{|s| [s.value, s.id]}, {:selected => params[:productattributesize], :include_blank => false, :prompt => "Select size"}, {}) %>
    .
    .
    .
    <%= f.submit "Save" %>
<% end %>

В настоящее время я получаю:

Productattributevalue(#2232715140) expected, got String(#70262645253120)

Как мне заставить это работать?

Заранее спасибо!

1 Ответ

0 голосов
/ 24 января 2020

Решением было установить productattributecolor_ids и productattributesize_ids в представлении:

<%= f.select(:productattributecolor_ids, Productattributevalue.product_color.uniq.order('id asc').map{|s| [s.value, s.id]}, {:include_blank => false, :prompt => "Select color"}, {}) %>
<%= f.select(:productattributesize_ids, Productattributevalue.product_size.uniq.order('id asc').map{|s| [s.value, s.id]}, {:include_blank => false, :prompt => "Select size"}, {}) %>

, а также добавить оба к attr_accessible модели productvatriant.rb:

class Productvariant < ActiveRecord::Base
  attr_accessible :productattributesize_ids, :productattributecolor_ids
  .
  .
  .
end

Таким образом, я могу установить значения атрибутов для обоих атрибутов или оставить их пустыми.

...