我的數據模型中有一些STI。 Task
記錄有兩種類型:PrimaryTask
和SecondaryTask
。所以我的ActiveRecord的模式是這樣的:ActiveRecord#becomes!記錄不存儲
class Task < ActiveRecord::Base
end
class PrimaryTask < Task
has_many :secondary_tasks
end
class SecondaryTask < Task
belongs_to :primary_task
end
我想提供一個方法來「促進」一SecondaryTask
到PrimaryTask
永久(如,持久化到數據庫)。從仔細閱讀文檔,看起來像the #becomes!
method是我想要的,但我無法得到它來保存數據庫中的更改。
id = 1
secondary_task = SecondaryTask.find(id)
primary_task = secondary_task.becomes!(PrimaryTask)
primary_task.id # => 1
primary_task.class # => PrimaryTask
primary_task.type # => "PrimaryTask"
primary_task.new_record? # => false
primary_task.changes # => { "type"=>[nil,"PrimaryTask"] }
primary_task.save! # => true
primary_task.reload # => raises ActiveRecord::RecordNotFound: Couldn't find PrimaryTask with id=1 [WHERE "tasks"."type" IN ('PrimaryTask')]
# Note: secondary_task.reload works fine, because the task's type did not change in the DB
不知道怎麼回事?我嘗試了以下的東西,無濟於事。我誤解了becomes!
?
- 隊的戰績是萬一「髒」的
save!
電話是一個空操作,因爲沒有任何屬性被標記髒(primary_task.update_attributes(updated_at: Time.current)
- 沒有幫助) - 的情況下,實際上破壞
secondary_task
他們都有相同的id
是一個問題。沒有幫助。該SecondaryTask
記錄已被刪除,但沒有PrimaryTask
創建(儘管調用save!
返回true
)
更新1
該日誌顯示可能的問題:
UPDATE "tasks" SET "type" = $1 WHERE "tasks"."type" IN ('PrimaryTask') AND "tasks"."id" = 2 [["type", "PrimaryTask"]]
所以更新失敗,因爲WHERE
子句導致找不到記錄。
正顯示出一些日誌? – Aguardientico 2014-09-03 23:32:32
啊哈!好問題,甚至沒有想到在那裏看。更新問題... – 2014-09-03 23:40:36
您是否嘗試過使用'#成爲'而不是'#becomes!'? – Aguardientico 2014-09-04 00:16:49