目前我的网页模型与公司模型之间的belongs_to关系存在问题。
当我在Page show.erb.html上时,我收到以下错误消息,我正在访问@ page.company.id:nil的未定义方法`id':NilClass
在公司模型中使用和不使用attr_accessor方法的此错误消息。
页面模型:
class Page < ActiveRecord::Base
belongs_to :company
end
公司型号:
class Company < ActiveRecord::Base
attr_accessor :id, :name
has_many :pages
end
公司迁移:
class CreateCompanies < ActiveRecord::Migration
def change
create_table :companies do |t|
t.string :name
t.timestamps
end
end
end
页面迁移:
class CreatePages < ActiveRecord::Migration
def change
create_table :pages do |t|
t.string :name
t.references :companies, index: true
t.timestamps
end
end
end
答案 0 :(得分:1)
由于网页只有一家公司,因此您的网页迁移应使用:
t.references :company, index: true
(单数)而不是:公司(复数)。这应该允许rails正确填充它。
答案 1 :(得分:0)
<强>协会强>
由于Rails设计为在relational database堆栈上运行,因此您必须了解此结构在定义&amp;堆栈中的作用。在模型中创建ActiveRecord associations。
为了给你一些想法 - ActiveRecord实际上是一种称为"ORM" (Object Relationship Mapper)的东西 - 意味着它将管理应用中“对象”之间的关系。由于Rails由于构建在Ruby之上,因此object orientated,ActiveRecord在管理对象之间的关系方面发挥着不可或缺的作用
您所指的问题是如何正确构建这些关系:
<强>模型强>
您的问题的答案是:
#app/models/page.rb
Class Page < ActiveRecord::Base
#fields id | company_id | other | attributes | created_at | updated_at
belongs_to :company
end
#app/models/company.rb
Class Company < ActiveRecord::Base
#fields id | title | other | page | attributes | created_at | updated_at
has_many :pages
end
要演示表格的外观,您可以使用此Rails documentation:
这意味着,在提及您的问题时,您可以使用Martin
的答案,也可以手动添加company_id
列(我们这样做):
class CreatePages < ActiveRecord::Migration
def change
create_table :pages do |t|
t.string :name
t.string :company_id
t.timestamps
end
end
end
<强>数据表强>
您应该了解的其他一些信息:
foreign_keys
的关联 - 每当您在模型中创建“关系”时,它都会触发ActiveRecord来识别关联的foreign_key
:
primary key
确定。每次在Rails中加载一个对象时,它实际上都是在数据库中查找它所拥有的相应id
这意味着如果您希望在Rails中识别记录,您需要确保它们在数据库中有primary key