如何通过关系创建相同has_many的作用域选择

问题描述 投票:0回答:1

我正在从事产品管理部分。我有productvariants,可以有很多productattributevaluesproductvariantdetails

[productattributevalues(绿色,黄色,S,XL)属于productattributes(颜色,大小和材料)。

我想在productvariants/_form上有两个单独的选择器,如果productvariantproductattributevalue类型为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)

我如何使它工作?

谢谢你!

ruby-on-rails has-many-through
1个回答
0
投票

解决方案是在视图中设置productattributecolor_idsproductattributesize_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

通过这种方式,我可以选择设置两个属性的属性值或将它们留空。

© www.soinside.com 2019 - 2024. All rights reserved.