属于外键

时间:2017-08-23 15:11:08

标签: ruby-on-rails activerecord foreign-keys ruby-on-rails-5

我大量陷入了一种在我看来应该非常简单的belongs_to关系。

如果我在从故障单到帐户的迁移中创建数据库关联,它会在故障单表上创建一个名为“account_id”的数据库字段,这很好。然后在我的Ticket模型中,我把:

belongs_to :created_by, class_name: 'Account'

但是对于rails 5,belongs_to关系会自动添加对account_id的需求存在的验证。但是,如果我传入created_by,则验证失败。因为我想验证created_by的存在而不是account_id。所以我添加了可选的:true标签

belongs_to :created_by, class_name: 'Account', optional: true

然后验证单独创建的存在

validates_presence_of :created_by

这一切都有效,但我不喜欢我说自己与自己发生矛盾,然后在一段时间后验证它是一个真正相同的领域!

然后我开始思考如果ticket表上的数据库中的字段实际上被称为created_by并使用一些主键和外键的东西,我建立它应该修复的关系吗?

但我不确定如何构建迁移,然后如何编写belongs_to。我试过了:

add_column :tickets, :created_by, :bigint
add_index :tickets, :created_by

belongs_to :created_by, class_name: 'Account', foreign_key: :created_by, primary_key: :account_id

但这完全失败,但是如果我这样做

belongs_to :account, foreign_key: :created_by

这使我能够用account_id为1来更新created_by,但是如果我运行ticket.created_by我得到int并且ticket.account返回帐户。我希望这是另一种方式。

1 个答案:

答案 0 :(得分:2)

所以我的问题在于迁移与rails关系的交互方式。我正在创建一个名为created_by的列并在其中存储id。这意味着created_by返回了id而不是关系。

迁移应该看起来像:

add_reference(:tickets, :created_by, foreign_key: {to_table: :accounts})

在ticket表上创建created_by_id。 然后在门票模型上我需要的是:

belongs_to :created_by, class_name: 'Account'

并且要查看其门票,您可以这样做:

has_many :tickets, foreign_key: 'created_by_id'