如何通过关系创建相同 has_many 的范围选择
How to create scoped selects of the same has_many through relation
我正在处理产品管理部分。我有 productvariants
,它可以有很多 productattributevalues
到 productvariantdetails
。
productattributevalues
(绿色、黄色、S、XL)belongs_toproductattributes
(颜色、尺码和material)。
我想在我的 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)
我怎样才能让它工作?
提前致谢!
解决方案是在视图中设置 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"}, {}) %>
以及将两者添加到 productvatriant.rb
模型的 attr_accessible
中:
class Productvariant < ActiveRecord::Base
attr_accessible :productattributesize_ids, :productattributecolor_ids
.
.
.
end
这样我可以选择为两个属性设置属性值或让它们留空。
我正在处理产品管理部分。我有 productvariants
,它可以有很多 productattributevalues
到 productvariantdetails
。
productattributevalues
(绿色、黄色、S、XL)belongs_toproductattributes
(颜色、尺码和material)。
我想在我的 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)
我怎样才能让它工作?
提前致谢!
解决方案是在视图中设置 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"}, {}) %>
以及将两者添加到 productvatriant.rb
模型的 attr_accessible
中:
class Productvariant < ActiveRecord::Base
attr_accessible :productattributesize_ids, :productattributecolor_ids
.
.
.
end
这样我可以选择为两个属性设置属性值或让它们留空。