【问题标题】:Rails Unknown attribute error, but attribute does existRails 未知属性错误,但属性确实存在
【发布时间】:2013-11-23 06:29:26
【问题描述】:

我在运行时收到错误未知属性 id

@user.payments.create(payment_params)

我知道这意味着我的付款表中需要一个 user_id。但是我正在使用多态关联(可能是错误的?)并且我的付款表有一个 payee_id 和一个 payer_id (对于每个“类型”的用户)。在上述方法中,@user 实例是付款人。

以下是支付和用户模型:

class Payment < ActiveRecord::Base
  belongs_to :payee, :class_name => 'User', :foreign_key => 'payee_id'
  belongs_to :payer, :class_name => 'User', :foreign_key => 'payer_id'
end

class User < ActiveRecord::Base
  has_many :payments
end

以及支付控制器中的创建操作:

def create
  @user = User.find_or_create_by(user_params)
  @payment = @user.payments.create(payment_params)
end

多态关联让我感到困惑。我该如何纠正这个错误?

【问题讨论】:

  • Rails 在支付表中寻找属性user_id。不是肯定的,但您可能还必须在用户的has_many 关系上指定:foreign_key

标签: ruby-on-rails associations has-many polymorphic-associations


【解决方案1】:

这不是多态关联。您必须正确定义关系才能获得所需的付款。从代码中我了解到这是一种贷款申请。

上述模型中的用户没有单一的支付类型。有两种付款方式,一种是用户获得资金,比如说incoming_payments,另一种是用户必须给钱outgoing_payments。关系应该定义为

class Payment < ActiveRecord::Base
  belongs_to :payee, :class_name => 'User', :foreign_key => 'payee_id'
  belongs_to :payer, :class_name => 'User', :foreign_key => 'payer_id'
end


class User < ActiveRecord::Base
  has_many :incoming_payments, :class_name => 'Payment', :foreign_key => 'payee_id'
  has_many :outgoing_payments, :class_name => 'Payment', :foreign_key => 'payer_id'
end

因此,如果您查询付款的用户是付款人,那么您应该致电user.outgoing_payements,如果用户是贷方,那么您应该致电user.incoming_payments

【讨论】:

  • 我按照你说的做了,这对我来说很有意义。但是现在当我调用 user.outgoing_payments 我得到一个 NameError: uninitialized constant User::Payments 更奇怪的是,当我运行 user.methods 时,outgoing_payments 被列为用户的实例方法
  • 我收回了。传出付款未列为 User 实例的方法。
  • class_name 应该是“付款”,输入...编辑答案
猜你喜欢
  • 2019-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多