0

我有一个模型分类

PaypalTransactionResponse(id: integer, paypal_transaction_id: uuid, response: text, created_at: datetime, updated_at: datetime)

class PaypalTransaction < ActiveRecord::Base
    has_many :responses, class_name: "PaypalTransactionResponse", dependent: :destroy
    belongs_to :response, class_name: "PaypalTransactionResponse", foreign_key: "response"
..
end

class PaypalTransactionResponse < ActiveRecord::Base
    has_one :paypal_transaction
    belongs_to :paypal_transaction
..
end

在 Rails 4.0.5 上,以下代码可以正常工作。在 Rails 4.1.1 上它没有

p = PaypalTransaction.first
p.responses.create(response: "some response text")

pry(#<PaypalTransaction>)> p.responses.create(response: "some response text")
  SQL (0.4ms)  INSERT INTO "paypal_transaction_responses" ("created_at", "paypal_transaction_id", "response", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["created_at", "2014-05-10 13:54:37.512642"], ["paypal_transaction_id", "048267d9-2d47-4f0b-bc67-e206e296179d"], ["response", "some response text"], ["updated_at", "2014-05-10 13:54:37.512642"]]
ActiveModel::MissingAttributeError: can't write unknown attribute `paypal_transaction_response_id'
from /Users/me/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.1/lib/active_record/attribute_methods/write.rb:72:in `write_attribute'

此外,我没有paypal_transaction_response_id属性。我想这里有一些不好的魔法,因为它试图猜测一些不存在的属性。

我在 Rails 4.1 更改日志中没有发现任何可能暗示此问题的更改。

我能做些什么?

4

1 回答 1

1

您的has_one :paypal_transaction关联很可能是问题的原因。

期望您的PaypalTransaction类上有一个指向的外键属性,PaypalTransactionResponse并且猜测该属性被称为paypal_transaction_response_id

如果你定义你的has_one喜欢:

has_one :paypal_transaction, foreign_key: "response"

那么这应该可以解决问题。

现在它在 rails 4.1 中失败的原因是不再支持写入任意属性(你不能这样做my_obj[:my_att] = 42)。我怀疑代码在 4.0.5 中没有错误,但可能没有完全按照您的预期工作 - 或者至少您没有正常工作。

于 2014-05-10T14:24:07.797 回答