accepted_nested_attributes与HABTM关系

时间:2014-07-28 17:33:15

标签: ruby-on-rails activerecord ruby-on-rails-4 params has-and-belongs-to-many

class OptionValue
    has_and_belongs_to_many :listings, join_table: 'listing_options'
    belongs_to :type

class Listing
    has_and_belongs_to_many :option_values, join_table: 'listing_options'
    accepts_nested_attributes_for :option_values

我在这里看了几个关于同一主题的问题,但是在所有这些问题中,提问者想要关于这种关系的其他功能,而是选择:通过。我希望使用accepts_nested_attributes将值添加到连接表。

列表具有每种选项类型的选项值。处理从表格收到的参数后,它们看起来像这样:

listing_params => { "option_values_attributes"=> [{"option_value"=>"3"}, {"option_value"=>"5"}, {"option_value"=>"9"}]}

在create中调用Listing.new(listing_params)会显示错误消息

Unpermitted parameters: option_values
ActiveRecord::UnknownAttributeError: unknown attribute: option_value

其他属性已成功保存到新列表实例。我也尝试将option_value_id作为参数使用相同的结果,并且在new中包含@ listing.option_values.build并没有什么区别。我可以将关系转换为:通过关系,但我不需要那种类型的关系,并且期望HABTM更有效率。参数中是否还有其他东西,或者我应该将关系类型更改为:through?

编辑 - 相关控制器代码

def create
  *binding.pry*
  @listing = Spree::Listing.new(listing_params)
  # @listing.save
def new
  @listing = Listing.new
  @listing.option_values.build

def listing_params
  params[:listing][:option_values_attributes] = []
  ovs = params[:listing][:option_values].values
  ovs.each do |ov|
    params[:listing][:option_values_attributes] << {"option_value" => ov}
  end
  params.require(:listing).permit(permitted_listing_attributes)
end

def permitted_listing_attributes
  [ :listing_options_attributes => [[:option_value_id]]] ]
end

编辑 - 我现在认为rails中不支持通过accepts_nested_attributes添加到连接表。传递选项值ids会引发错误。在实例化新列表时(下面),传递type_id不会引发错误,表明我们可以使用accepts_nested_attributes和HABTM来创建新的选项值,但不能仅用于添加到连接表。

Listing.new({state: "1", "option_values_attributes" => [{"type_id" =>"30"}] })

1 个答案:

答案 0 :(得分:1)

如果您还没有,请查看docs的accepts_nested_attributes。

您需要在OptionValue的参数中包含您想要更新的Listing参数。

除了文档之外的其他资源:优秀的railscasts

你认为HABTM更有效率&#34;而不是has_many:通过是假的。事实上,如果你深入研究rails实现HABTM的方式,你会发现它只是创建了另一个has_many:through。查看此内容的简便方法是reflect_on_all_associations()为您的某个课程。您不会看到has_and_belongs_to_many关系,但您会看到has_many :through联接表和has_many与联接表关系的关联。如果您知道如何使用:through来解决此问题,请进行切换。