Jon*_*han 2 ruby ruby-on-rails ruby-on-rails-3
我有以下设置来处理类别和子类别。
类别.rb
class Category < ActiveRecord::Base
extend FriendlyId
friendly_id :name, use: :slugged
has_many :subcategories
has_many :products ,:through => :subcategories
end
Run Code Online (Sandbox Code Playgroud)
子类别.rb
class Subcategory < ActiveRecord::Base
belongs_to :category
has_many :products
end
Run Code Online (Sandbox Code Playgroud)
产品.rb
class Product < ActiveRecord::Base
acts_as_taggable
extend FriendlyId
friendly_id :name, use: :slugged
belongs_to :subcategory
end
Run Code Online (Sandbox Code Playgroud)
我是否需要添加一个category_id:integer & subcategory_id:integer到产品模型中才能使其工作,或者Rails会自动为我处理这个问题吗?
是的,您需要将category_id和subcategory_id添加到模型迁移文件中才能使其正常工作。除非您明智地使用语法,否则 Rails 不会为您做这件事rails generate。例如。首先你创建Category模型
rails generate model Category name:string
Run Code Online (Sandbox Code Playgroud)
然后您创建Subcategory模型传递类别作为参考。
rails generate model Subcategory name:string category:references
Run Code Online (Sandbox Code Playgroud)
然后创建Product模型传递子类别作为参考
rails generate model Product name:string subcategory:references
Run Code Online (Sandbox Code Playgroud)
这将自动将category_id和添加subcategory_id到迁移文件中。不过,您必须自己在模型中编写关系(即仅部分has_many)
如果您没有错误地完成此操作,您可以通过rails generate命令或手动创建新的迁移。
rails g migration AddCategoryRefToSubcategories category:references
rails g migration AddSubcategoryRefToProducts subcategory:references
Run Code Online (Sandbox Code Playgroud)
这将为您创建适当的迁移文件,然后运行rake db:migrate. :)