0

У меня есть модель отношений, в которой студенты и работодатели могут вступать в отношения при обращении к проекту. Вот модели:Почему моя связь базы данных has_one не работает в рельсах?

class Student < User 
    has_many :relationships, dependent: :destroy 
    has_many :employers, through: :relationships 
end 

class Employer < User 
    has_many :projects 
    has_many :relationships, dependent: :destroy 
    has_many :students, through: :relationships 
end 

class Relationship < ActiveRecord::Base 
    has_one :project 
    belongs_to :employer 
    belongs_to :student 

    validates_uniqueness_of :project_id, :scope => [:employer_id, :student_id] 
end 

class Project < ActiveRecord::Base 
    belongs_to :employer 
end 

Состояние - столбец в таблице проектов, который автоматически устанавливается равным «проводке». Я пытаюсь показать все отношения, у которых есть проект с состоянием ==: posting. Вот мой взгляд код:

<% @relationships.each do |relationship| %> 
     <% if relationship.project.state == :posting %> 
      <%= relationship.project.inspect %> 
     <% end %> 
<% end %> 

Кроме того, в контроллер для этой точки зрения:

@relationships = Relationship.all 

Когда я пытаюсь открыть окно, я получаю:

PG::UndefinedColumn: ERROR: column projects.relationship_id does not exist 

Что Безразлично Для меня смысл, так это то, что я не смотрю в таблице проектов для столбца relationship_id. Мой код должен найти проект из отношения, а затем найти столбец состояния. У меня есть отношения has_one: project, но у меня нет: проекты принадлежат отношениям, потому что проект не нуждается в отношениях, чтобы существовать. Я уверен, что мои отношения с базой данных правильные. Как исправить мой код просмотра? Или, если мои отношения db неправильны, что не так?

Обновление Я забыл упомянуть, что работодатель и ученик являются моделями пользователей с помощью полиморфной ассоциации. Модель пользователя имеет столбец типа, который может быть либо студентом, либо работодателем.

ответ

3

Когда вы заявляете, что Relationshiphas_one :project, вы сообщаете Rails, что Project модель (и соответствующая таблица projects базы данных) имеет relationship_id поле. Когда вы ссылаетесь на relationship.project, вы можете ссылаться на эту таблицу/поле, что приводит к ошибке.

Учитывая, что каждая взаимосвязь должна иметь только один связанный с ней проект, вы должны объявить Project как belongs_to :relationship, создайте соответствующую миграцию и обновите свой код соответственно, чтобы сохранить значение этого поля.

+0

Хм, проблема в том, что есть много отношений, которые могут иметь один и тот же проект. – Philip7899

+0

Тогда ваши отношения должны быть 'own_to: project', и ваш проект должен' has_many: relationship'. –

0

На первый взгляд кажется, что это должно быть

class Employer < User 
    has_many :projects, through: :relationships 

для этой работы. Я что-то упускаю?

+0

Возможно, я должен был упомянуть. Работодатель и ученик - это модели пользователей с помощью полиморфной ассоциации. Модель пользователя имеет столбец типа, который может быть либо студентом, либо работодателем. Я добавлю это в содержание вопроса. Благодарю. – Philip7899

+0

Кроме того, у работодателя есть проект независимо от того, существует ли связь. Работодатель может создать проект. Нет отношения, пока ученик не обратится к проекту. – Philip7899

Смежные вопросы