【发布时间】: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