我有一个分类的模型
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更改日志中发现任何可能暗示此问题的更改。
我该怎么办?
答案 0 :(得分: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中没有错误,但可能并没有像你期望的那样完全正常工作 - 或者至少你正在逃避它无法正常工作。