引用外键属性rails

时间:2017-10-19 19:37:01

标签: ruby-on-rails

我有一个脚手架VirtualTransaction引用我的用户模型。

virtual_transaction.rb

class VirtualTransaction < ApplicationRecord
  has_one :buyer, :class_name => 'User', :foreign_key => 'buyer_id'
  has_one :seller, :class_name => 'User', :foreign_key => 'seller_id'
end

user.rb

class User < ApplicationRecord
  has_many :virtual_transactions
end

但我无法采取任何进一步措施来访问该协会。

我明白了:

ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR:  column 
users.buyer_id does not exist
LINE 1: SELECT  "users".* FROM "users" WHERE "users"."buyer_id" = $1...
: SELECT  "users".* FROM "users" WHERE "users"."buyer_id" = $1 LIMIT $2
from (irb):7

当我尝试做的时候:

virtual_transaction=VirtualTransaction.first
virtual_transaction.buyer

我打算做的就是访问引用买家/卖家ID的用户名,并在我的视图中显示。

VirtualTransaction(id: integer, buyer_id: integer, seller_id: integer, amount: decimal, created_at: datetime, updated_at: datetime) 

2 个答案:

答案 0 :(得分:1)

我认为您应该使用belongs_to代替has_one作为您的关联。这将导致ActiveRecord在buyer_id表中查找virtual_transactions外键:

class VirtualTransaction < ApplicationRecord
  belongs_to :buyer, :class_name => 'User', :foreign_key => 'buyer_id'
  belongs_to :seller, :class_name => 'User', :foreign_key => 'seller_id'
end

答案 1 :(得分:0)

您使用buyer_id作为表格列来存储引用,而postgresql无法找到该列。 我不知道你的表结构,但你可以在这种情况下为外键添加一列,如下所示:

rails g migration AddBuyerIdToVirtualTransaction buyer_id:integer

此外,您说您的脚手架名为VirtualTransaction,但在您粘贴的代码段中,该类仅为名称Transaction

我认为你的表/列名称有些错误。如果您发布更多有关详细信息,我们可以提供更好的帮助。祝你好运