我正在使用Rails 5.0.1进行Web开发并在Heroku上部署我的应用程序。我使用postgreSQL作为Heroku的数据库,使用sqlite3作为我的本地开发数据库。
我需要将Accounts表的account_number
列链接到Transactions表中的两列。 account_number
列不是Accounts表的主键。
并且,“交易”表格中有一列from_account
,我想将其链接到account_number
表格中的Accounts
列,
我想要链接到to_account
表的account_number
列的另一列 - Accounts
。
account_number
不是帐户表的主键,但它是唯一的。
我正在尝试在我的迁移文件中执行以下操作:
create_table :transactions do |t|
t.string :from_account, foreign_key: true
t.string :to_account, foreign_key: true
t.timestamps
end
add_foreign_key :transactions, column: :from_account, :accounts, column: :account_number
add_foreign_key :transactions, column: :to_account, :accounts, column: :account_number
我的模型文件如下所示:
class Transaction < ApplicationRecord
belongs_to :from_account, :foreign_key => 'from_account', :class_name => 'Account'
belongs_to :to_account, :foreign_key => 'to_account', :class_name => 'Account'
end
但是这会给我的本地sqlite3数据库和Heroku的PostgreSQL数据库带来错误。
如何在Rails5中对这样的东西进行建模。 到目前为止,我在网上找到的所有教程都只讲述了如何链接到引用表的主键。
编辑:也许我的问题不清楚,但是account_number字段在我的数据库的Accounts表中已经是唯一的。这是我的Accounts表的架构:
create_table :accounts do |t|
t.string :account_number, :unique => true
# Other fields
t.timestamps
end
答案 0 :(得分:6)
尝试primary_key:
class Transaction < ApplicationRecord
belongs_to :from_account, :foreign_key => 'from_account', :class_name => 'Account', :primary_key => 'account_number'
belongs_to :to_account, :foreign_key => 'to_account', :class_name => 'Account', :primary_key => 'account_number'
end
答案 1 :(得分:3)
正如Arcana's answer所述,通过:primary_key
:
class Transaction < ApplicationRecord
belongs_to :from_account, :foreign_key => 'from_account', :class_name => 'Account',
:primary_key => 'account_number'
belongs_to :to_account, :foreign_key => 'to_account', :class_name => 'Account',
:primary_key => 'account_number'
end
:primary_key
中的语言belongs_to
具有误导性。它应该是:candidate_key
或:references
或:unique
或primary_key_or_unique
。但它不是。它不会影响引用类中的主键。
4详细的协会参考
4.1 belongs_to协会参考
4.1.2belongs_to
的选项
4.1.2.6:primary_key
按照惯例,Rails假定id列用于保存其表的主键。
:primary_key
选项允许您指定其他列。
(在关系模型中,外键引用候选键,它是一些唯一(非空)列集,不包含较小的唯一(非空)列集,并且是一组列您可以选择作为主键。但是在(Active Record和)SQL中,PRIMARY KEY
实际上声明了UNIQUE NOT NULL
(可能包含较小的UNIQUE NOT NULL
)和FOREIGN KEY
{ {1}} REFERENCES
。)
答案 2 :(得分:0)
我猜这是因为没有指定主键during your migration或within your model