Rails 添加对相关模型的引用

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会自动为我处理这个问题吗?

Kum*_*mar 7

是的,您需要将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​​. :)