Rails belongs_to关系不起作用

时间:2014-08-17 09:20:28

标签: ruby-on-rails ruby belongs-to

目前我的网页模型与公司模型之间的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

2 个答案:

答案 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

enter image description here

这意味着,在提及您的问题时,您可以使用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

<强>数据表

您应该了解的其他一些信息:

  1. Rails建立与foreign_keys的关联 - 每当您在模型中创建“关系”时,它都会触发ActiveRecord来识别关联的foreign_key
  2. enter image description here

    1. 最后,您还需要了解数据表中“记录”的标识由它具有的primary key确定。每次在Rails中加载一个对象时,它实际上都是在数据库中查找它所拥有的相应id
    2. 这意味着如果您希望在Rails中识别记录,您需要确保它们在数据库中有primary key