为什么我的has_one数据库关系在rails中不起作用?

时间:2013-11-14 21:16:50

标签: ruby-on-rails rails-activerecord has-many-through has-and-belongs-to-many

我有一种关系模式,学生和雇主在申请项目时可以建立关系。以下是模型:

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

State是项目表中的一列,自动设置为“发布”。我试图显示所有具有州==:发布项目的关系。这是我的观看代码:

<% @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

对我来说没有意义的是,我没有在projects表中查找relationship_id列。我的代码应该从关系中找到项目,然后找到状态列。我有关系has_one:项目,但我没有:项目belongs_to关系,因为项目不需要关系才能存在。我很确定我的数据库关系是正确的。如何修复我的视图代码?或者,如果我的数据库关系错误,那有什么不对?

更新 我忘了提到雇主和学生都是通过多态关联的用户模型。用户模型有一个类型列,可以是Student或Employer。

2 个答案:

答案 0 :(得分:3)

当您声明Relationship has_one :project时,您告诉Rails Project模型(以及相应的projects数据库表)具有relationship_id字段。当您在视图中引用relationship.project时,会导致引用该表/字段,从而导致错误。

鉴于每个关系应该只有一个与之关联的项目,您应该将Project声明为belongs_to :relationship,创建相应的迁移并相应地更新代码以维护此字段的值。 / p>

答案 1 :(得分:0)

乍一看似乎应该是

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

为此工作。我错过了什么吗?