Отношения Rails contains_to не работают

В настоящее время у меня возникают проблемы с отношением own_to между моей моделью страницы и моей моделью компаний.

Я получаю следующее сообщение об ошибке, когда я нахожусь на странице show.erb.html и получаю доступ к @page.company.id: неопределенный метод `id' для nil: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

person user2755270    schedule 17.08.2014    source источник


Ответы (2)


Поскольку на странице есть одна компания, ваша миграция страницы должна использовать:

t.references :company, index: true

(единственное число) вместо: компании (множественное число). Это должно позволить рельсам заполнить его правильно.

person Martin    schedule 17.08.2014
comment
Правильный ответ! Я напишу продолжение, чтобы предоставить некоторый контекст - person Richard Peck; 17.08.2014

Ассоциации

Поскольку Rails предназначен для работы в стеке реляционной базы данных, вы должны оценить роль этого структура играет роль в определении и создании ассоциаций ActiveRecord в ваших моделях.

Чтобы дать вам некоторые идеи: ActiveRecord на самом деле называется "ORM" (сопоставитель отношений объектов) — это означает, что он будет управлять отношениями между " объекты" в вашем приложении. Поскольку Rails, будучи построенным поверх Ruby, объектно-ориентированный, 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< /а>:

введите здесь описание изображения

Это означает, что в отношении вашего вопроса вы можете либо использовать ответ 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 для ассоциации:

введите здесь описание изображения

  1. Наконец, вы также должны понимать, что идентификация «записей» в таблице данных определяется primary key имеет. Каждый раз, когда вы загружаете объект в Rails, он на самом деле ищет в базе данных соответствующий id, который у него есть.

Это означает, что если вы хотите идентифицировать записи в Rails, вам нужно убедиться, что они имеют primary key в базе данных.

person Richard Peck    schedule 17.08.2014
comment
Это гораздо более длинный ответ, чем требуется, но он является хорошим руководством для тех, кому он понадобится в будущем. Компании вместо Компаний было бы достаточно. - person user2755270; 18.08.2014