使用 HABTM 添加记录
Add records with HABTM
我正在尝试使用以下方法为产品分配多个类别
class Category < ActiveRecord::Base
has_many :categories_products
has_many :products, :through => :categories_products
validates :name, presence: true, length: { maximum: 255 }
end
class CategoryProduct < ActiveRecord::Base
belongs_to :category
belongs_to :product
end
class Product < ActiveRecord::Base
has_many :categories_products
has_many :categories, :through => :categories_products
end
产品控制器
def new
form_info
if @categories.empty?
flash[:notice] = 'You must create a category before you create a product.'
redirect_to new_admin_merchandise_prototype_url
else
@product = Product.new
@product.categories << @categories
# @product.category = Category.new
end
end
产品浏览
.mdl-grid
.mdl-cell.mdl-cell--12-col
h3.mdl-typography--display-1.teal-heading= t('.title')
.mdl-grid
.mdl-cell.mdl-cell--12-col.card-item-type--volume
.mdl-textfield.mdl-js-textfield.mdl-textfield--floating-label.mdl-cell.mdl-cell--12-col
= form.text_field :name, class: 'mdl-textfield__input', required: true
= form.label :name, class: 'mdl-textfield__label'
.mdl-textfield.mdl-js-textfield.mdl-textfield--floating-label.mdl-cell.mdl-cell--12-col
= form.text_area :keywords, class: 'mdl-textfield__input'
= form.label :keywords, class: 'mdl-textfield__label'
.mdl-textfield.mdl-js-textfield.mdl-textfield--floating-label.mdl-cell.mdl-cell--12-col
= form.text_area :description, class: 'mdl-textfield__input'
= form.label :description, class: 'mdl-textfield__label'
.mdl-grid
.mdl-cell.mdl-cell--6-col
h3.mdl-typography--display-1.teal-heading Categories
.mdl-grid
.mdl-cell.mdl-cell--12-col.card-item-type--volume
.mdl-grid
- @categories.each_slice((@categories.count/3).ceil) do |cg|
.mdl-cell.mdl-cell--3-col
- cg.each do |c|
label.mdl-checkbox.mdl-js-checkbox.mdl-js-ripple-effect.mdl-cell.mdl-cell--12-col for=c.id
= form.check_box :categories, :class => 'mdl-checkbox__input', :id => c.id
span.mdl-checkbox__label= c.name.titlecase
.mdl-grid
.mdl-cell.mdl-cel--12-col
= form.submit class: 'mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--accent'
错误
NameError: uninitialized constant Product::CategoriesProduct
您遇到命名问题:
您的模型名为 CategoryProduct
。检查您创建 table 的迁移:它很可能是这样的:
create_table :category_products do |t|
t.belongs_to :product
t.belongs_to :category
t.timestamps
end
这里的重要部分是:category_products
。相同的 table 名称将显示在您的 db/schema.rb
中
如果您还没有看到它:产品是单数,而类别是复数。
然后问题出现在关系中:
has_many :categories_products
在寻找正确模型的过程中 rails 使用 .singularize
.,它只将字符串中的最后一个单词单数化。
运行 'categories_products'.singularize
returns
=> "categories_product"
因此 rails 正在寻找模型 CategoriesProduct
但没有找到。检查您的错误消息 ;)
可以通过三种方式解决:
1) 更改您的 table 姓名
使用 rake db:rollback
撤消迁移,将名称更改为已定义 table 名称更改为 category_products
,然后再次迁移。
2) 更改您的型号名称
将文件更改为categories_product
,将模型更改为CategoriesProduct
3) 在关系
中指定join_table
has_many :categories_products, :join_table => :category_products
不要这样做 - 这是一个丑陋的修复 - 选择 1) 或 2)
我正在尝试使用以下方法为产品分配多个类别
class Category < ActiveRecord::Base
has_many :categories_products
has_many :products, :through => :categories_products
validates :name, presence: true, length: { maximum: 255 }
end
class CategoryProduct < ActiveRecord::Base
belongs_to :category
belongs_to :product
end
class Product < ActiveRecord::Base
has_many :categories_products
has_many :categories, :through => :categories_products
end
产品控制器
def new
form_info
if @categories.empty?
flash[:notice] = 'You must create a category before you create a product.'
redirect_to new_admin_merchandise_prototype_url
else
@product = Product.new
@product.categories << @categories
# @product.category = Category.new
end
end
产品浏览
.mdl-grid
.mdl-cell.mdl-cell--12-col
h3.mdl-typography--display-1.teal-heading= t('.title')
.mdl-grid
.mdl-cell.mdl-cell--12-col.card-item-type--volume
.mdl-textfield.mdl-js-textfield.mdl-textfield--floating-label.mdl-cell.mdl-cell--12-col
= form.text_field :name, class: 'mdl-textfield__input', required: true
= form.label :name, class: 'mdl-textfield__label'
.mdl-textfield.mdl-js-textfield.mdl-textfield--floating-label.mdl-cell.mdl-cell--12-col
= form.text_area :keywords, class: 'mdl-textfield__input'
= form.label :keywords, class: 'mdl-textfield__label'
.mdl-textfield.mdl-js-textfield.mdl-textfield--floating-label.mdl-cell.mdl-cell--12-col
= form.text_area :description, class: 'mdl-textfield__input'
= form.label :description, class: 'mdl-textfield__label'
.mdl-grid
.mdl-cell.mdl-cell--6-col
h3.mdl-typography--display-1.teal-heading Categories
.mdl-grid
.mdl-cell.mdl-cell--12-col.card-item-type--volume
.mdl-grid
- @categories.each_slice((@categories.count/3).ceil) do |cg|
.mdl-cell.mdl-cell--3-col
- cg.each do |c|
label.mdl-checkbox.mdl-js-checkbox.mdl-js-ripple-effect.mdl-cell.mdl-cell--12-col for=c.id
= form.check_box :categories, :class => 'mdl-checkbox__input', :id => c.id
span.mdl-checkbox__label= c.name.titlecase
.mdl-grid
.mdl-cell.mdl-cel--12-col
= form.submit class: 'mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--accent'
错误
NameError: uninitialized constant Product::CategoriesProduct
您遇到命名问题:
您的模型名为 CategoryProduct
。检查您创建 table 的迁移:它很可能是这样的:
create_table :category_products do |t|
t.belongs_to :product
t.belongs_to :category
t.timestamps
end
这里的重要部分是:category_products
。相同的 table 名称将显示在您的 db/schema.rb
如果您还没有看到它:产品是单数,而类别是复数。
然后问题出现在关系中:
has_many :categories_products
在寻找正确模型的过程中 rails 使用 .singularize
.,它只将字符串中的最后一个单词单数化。
运行 'categories_products'.singularize
returns
=> "categories_product"
因此 rails 正在寻找模型 CategoriesProduct
但没有找到。检查您的错误消息 ;)
可以通过三种方式解决:
1) 更改您的 table 姓名
使用 rake db:rollback
撤消迁移,将名称更改为已定义 table 名称更改为 category_products
,然后再次迁移。
2) 更改您的型号名称
将文件更改为categories_product
,将模型更改为CategoriesProduct
3) 在关系
中指定join_tablehas_many :categories_products, :join_table => :category_products
不要这样做 - 这是一个丑陋的修复 - 选择 1) 或 2)