【问题标题】:Belongs To Foreign Key属于外键
【发布时间】:2017-08-23 15:11:08
【问题描述】:

我被严重困在了一个应该很简单的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

这一切都行得通,但我不喜欢这样,我自相矛盾地说可选,然后在后面一行验证它实际上是同一个字段!

然后我开始思考如果门票表上数据库中的字段实际上被称为 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

这使我能够更新 created_by 说 account_id 为 1,但如果我运行 ticket.created_by 我得到 int 并且 ticket.account 返回帐户。我希望这是相反的方式。

【问题讨论】:

  • 我越看这个,我认为这是 rails 为 belongs_to 创建它的 validates_presence_of 的方式中的一个错误。它使用与我正在定义的关系并列的表列。

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


【解决方案1】:

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

迁移应该是这样的:

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

在门票表上创建一个 created_by_id。 然后在门票模型上,我只需要:

belongs_to :created_by, class_name: 'Account'

对于一个帐户,您可以查看其票证:

has_many :tickets, foreign_key: 'created_by_id'

【讨论】:

    猜你喜欢
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多