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"}] })
答案 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
来解决此问题,请进行切换。