Rails HABTM 设置、模型对象和 join_table 插入控制器设置
Rails HABTM setup, model object, & join_table insertion controller setup
我有以下设置。
1 个产品有多个 product_types。
许多 product_types 有 1 种类型。
根据我对文档的理解的 HABTM 关系。
我的模特是
class Product < ApplicationRecord
has_and_belongs_to_many :types
end
class Type < ApplicationRecord
has_and_belongs_to_many :products
end
我有一个加入 table 迁移
class CreateJoinTableProductTypes < ActiveRecord::Migration[5.1]
def change
create_join_table :products, :types do |t|
t.index :product_id
t.index :type_id
end
end
end
我已经创建了一个表单 - 希望创建正确,现在我在表单提交时发送了以下参数:
"product"=>{"name"=>"Product A", "description"=>"A cool product", "image_dir_path"=>"./",
"type"=>{"id"=>"1"}},"commit"=>"Create Product"}
我在想
1) 在表单和控制器中提交用于创建产品的参数的 best/rails 约定是什么?
和
2) 我怎么are/do 把记录插入join table?
我有以下获取参数的方法
def product_params
params.require(:product).permit(:name, :description, :image_dir_path, :type,)
end
但即便如此,我仍然可以在日志中看到 :type
的未经许可的参数
目前我的控制器只有:
@product = Product.new(product_params)
如有任何有关 rails 创建此对象的建议,我将不胜感激。我已经阅读了 HABTM 的 api 文档,但没有看到任何关于模型对象或我应该如何在控制器中处理这些东西的内容。
谢谢!
ActieRecord 为所有 has_many
and has_and_belongs_to_many
个关联生成 _ids
个 setter 和 getter。
# creates 3 rows in products_types if they do not exist
# also deletes any rows not in the array
@product.update(type_ids: [1,2,3])
这些与 form options helpers 一起用于分配关联:
<%= form_for(@product) do |f| %>
<div class="field">
<%= f.label :type_ids %>
<%= f.collection_select :type_ids, Type.all, :id, :name, multiple: true %>
</div>
...
<% end %>
要将参数列入白名单,您将其作为选项传递,值为 []
,允许包含任何标量类型的数组。
def product_params
params.require(:product).permit(:name, :description, :image_dir_path, type_ids: [])
end
2) how are/do I get, the records inserted into the join table?
使用 has_and_belongs_to_many
关联,您只能间接 insert/access 行。
例如:
@product.types
# or
@product.types << Type.first
# or
@product.types.create(name: 'Foo')
或使用前面提到的type_ids
setter/getter。这是与 has_many through:
的一个关键区别,在 has_many through:
中您有一个可以直接查询或创建的连接模型。
在 max 的评论之后,我意识到类型关系不是 HABTM,而是一对多的产品。不过,我有另一个模型尺寸,它在带有产品的 HABTM 中。
我的模型是这样的:
class Product < ApplicationRecord
belongs_to :product_type
has_and_belongs_to_many :sizes
end
class Size < ApplicationRecord
has_and_belongs_to_many :products
end
加入table是:
class CreateJoinTableProductSize < ActiveRecord::Migration[5.1]
def change
create_join_table :cakes, :sizes do |t|
t.index [:product_id, :size_id]
end
end
end
大小table是默认值
产品 table 是
class CreateProducts < ActiveRecord::Migration[5.1]
def change
create_table :products do |t|
t.string :name
t.string :description
t.references :product_type, foreign_key: true
t.timestamps
end
end
end
我的控制器是默认控制器 - 我只是将以下参数列入白名单
def cake_params
params.require(:product).permit(:name, :description, :product_type_id, {:size_ids=>[]})
结束
我的 _form 有以下内容
<div class="field">
<%= form.label :product_type_id %>
<%= form.collection_select(:product_type_id, ProductType.all, :id, :name) %>
</div>
<div class="field">
<%= form.label :product_size %>
<%= collection_check_boxes(:product, :size_ids, Size.all, :id, :name) %>
</div>
现在我可以提交表单,对其进行编辑,所有值都可以正确显示!
我有以下设置。
1 个产品有多个 product_types。 许多 product_types 有 1 种类型。 根据我对文档的理解的 HABTM 关系。
我的模特是
class Product < ApplicationRecord
has_and_belongs_to_many :types
end
class Type < ApplicationRecord
has_and_belongs_to_many :products
end
我有一个加入 table 迁移
class CreateJoinTableProductTypes < ActiveRecord::Migration[5.1]
def change
create_join_table :products, :types do |t|
t.index :product_id
t.index :type_id
end
end
end
我已经创建了一个表单 - 希望创建正确,现在我在表单提交时发送了以下参数:
"product"=>{"name"=>"Product A", "description"=>"A cool product", "image_dir_path"=>"./",
"type"=>{"id"=>"1"}},"commit"=>"Create Product"}
我在想 1) 在表单和控制器中提交用于创建产品的参数的 best/rails 约定是什么?
和
2) 我怎么are/do 把记录插入join table?
我有以下获取参数的方法
def product_params
params.require(:product).permit(:name, :description, :image_dir_path, :type,)
end
但即便如此,我仍然可以在日志中看到 :type
的未经许可的参数目前我的控制器只有:
@product = Product.new(product_params)
如有任何有关 rails 创建此对象的建议,我将不胜感激。我已经阅读了 HABTM 的 api 文档,但没有看到任何关于模型对象或我应该如何在控制器中处理这些东西的内容。
谢谢!
ActieRecord 为所有 has_many
and has_and_belongs_to_many
个关联生成 _ids
个 setter 和 getter。
# creates 3 rows in products_types if they do not exist
# also deletes any rows not in the array
@product.update(type_ids: [1,2,3])
这些与 form options helpers 一起用于分配关联:
<%= form_for(@product) do |f| %>
<div class="field">
<%= f.label :type_ids %>
<%= f.collection_select :type_ids, Type.all, :id, :name, multiple: true %>
</div>
...
<% end %>
要将参数列入白名单,您将其作为选项传递,值为 []
,允许包含任何标量类型的数组。
def product_params
params.require(:product).permit(:name, :description, :image_dir_path, type_ids: [])
end
2) how are/do I get, the records inserted into the join table?
使用 has_and_belongs_to_many
关联,您只能间接 insert/access 行。
例如:
@product.types
# or
@product.types << Type.first
# or
@product.types.create(name: 'Foo')
或使用前面提到的type_ids
setter/getter。这是与 has_many through:
的一个关键区别,在 has_many through:
中您有一个可以直接查询或创建的连接模型。
在 max 的评论之后,我意识到类型关系不是 HABTM,而是一对多的产品。不过,我有另一个模型尺寸,它在带有产品的 HABTM 中。
我的模型是这样的:
class Product < ApplicationRecord
belongs_to :product_type
has_and_belongs_to_many :sizes
end
class Size < ApplicationRecord
has_and_belongs_to_many :products
end
加入table是:
class CreateJoinTableProductSize < ActiveRecord::Migration[5.1]
def change
create_join_table :cakes, :sizes do |t|
t.index [:product_id, :size_id]
end
end
end
大小table是默认值 产品 table 是
class CreateProducts < ActiveRecord::Migration[5.1]
def change
create_table :products do |t|
t.string :name
t.string :description
t.references :product_type, foreign_key: true
t.timestamps
end
end
end
我的控制器是默认控制器 - 我只是将以下参数列入白名单
def cake_params params.require(:product).permit(:name, :description, :product_type_id, {:size_ids=>[]}) 结束
我的 _form 有以下内容
<div class="field">
<%= form.label :product_type_id %>
<%= form.collection_select(:product_type_id, ProductType.all, :id, :name) %>
</div>
<div class="field">
<%= form.label :product_size %>
<%= collection_check_boxes(:product, :size_ids, Size.all, :id, :name) %>
</div>
现在我可以提交表单,对其进行编辑,所有值都可以正确显示!