我大量陷入了一种在我看来应该非常简单的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
返回帐户。我希望这是另一种方式。
答案 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'