Rails Relational Database无法正常工作

时间:2014-05-01 20:59:09

标签: ruby-on-rails activerecord ruby-on-rails-4

在控制台

a = Reported.new

这很有效。经过修修补补。

a.profile  = Profile.first

但这不是我想要的!我希望a.profile甚至存在。我想a.reported_by成为个人资料!我希望a.reported成为个人资料!

我想要的是

a.reported_by = Profile.last #or any such profile
a.reported = Profile.first #or any such profile

模型

class Profile < ActiveRecord::Base
  has_many :reported, dependent: :destroy

移植

它没有报告的列,我也不确定实现它的正确方法。

class CreateReporteds < ActiveRecord::Migration
  def change
    create_table :reporteds do |t|
      t.belongs_to :profile
      t.integer :reported_by
      t.string :reason
      t.timestamps
    end
  end
end

1 个答案:

答案 0 :(得分:1)

您的迁移似乎已关闭。我在迁移中从未见过t.belongs_to :something - 不应该是t.integer :profile_id吗? (我无法找到支持belongs_to语法的文档。

如果您希望Reported#reported_by返回Profile,那么您需要一个reported_by_id整数,而不是reported_by整数。 Rails有一个约定,你应该让你引用的对象(在这种情况下,belongs_to :reported_by关系)使用relationship_id格式的外键。

然后你应该在课堂上有这个:

class Reported < ActiveRecord::Base
  belongs_to :reported_by, class_name: "Profile"
end

这样就可以使用reported_by_id作为Profile对象的外键,但将其作为Reported#reported_by返回。

然后:

class Profile < ActiveRecord::Base
  has_many :reporteds, foreign_key: 'reported_by_id'
end

应该让你Profile#reporteds

您的迁移将如下所示:

class CreateReporteds < ActiveRecord::Migration
  def change
    create_table :reporteds do |t|
      t.integer :reported_by_id
      t.string :reason
      t.timestamps
    end
  end
end