입니다. Rails 프로젝트에서 단일 테이블 상속을 사용하고 한 모델의 유형을 다른 모델의 유형으로 변경하려고합니다. 다음은 관련 스키마 및 모델입니다.ActiveRecord :: Persistence #를 사용하는 단일 테이블 상속 모델 변환은
create_table "images", force: true do |t|
t.string "url"
t.string "type"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "user_id", limit: 255
end
class Image < ActiveRecord::Base
validates :url, :user_id, presence: true
end
class UnconfirmedImage < Image
end
class ConfirmedImage < Image
end
UnconfirmedImage를 ConfirmedImage로 또는 그 반대로 변환해야합니다. 나는 ActiveRecord::Persistance#becomes!을 사용하여 이것을 할 수 있어야한다. 나는 변경 사항을 저장하려고 할 때
그러나, 자동으로 실패 할 것 같다
foo = UnconfirmedImage.new(url: "foo", user_id:1)
=> #<UnconfirmedImage id: nil, url: "foo", type: "UnconfirmedImage", created_at: nil, updated_at: nil, user_id: 1>
foo.save
#sql omitted
=> true
bar = foo.becomes!(ConfirmedImage)
=> #<ConfirmedImage id: nil, url: "foo", type: "ConfirmedImage", created_at: nil, updated_at: nil, user_id: 1>
bar.save
참고 여기에 생성 된 잘못된 SQL. 타입에 대한 WHERE 절은 이전 타입이 아닌 새로운 타입을 검사합니다. 이것은 사실을 반환해서는 안됩니다.
[13891][12:32:05.583 +0000][DEBUG]: (0.1ms) begin transaction
[13891][12:32:05.598 +0000][DEBUG]: SQL (0.3ms) UPDATE "images" SET "type" = ?,"updated_at" = ? WHERE "images"."type" IN ('ConfirmedImage') AND "images"."id" = 2 [["type", "ConfirmedImage"], ["updated_at", Mon, 17 Feb 2014 12:32:05 UTC +00:00]]
[13891][12:32:05.599 +0000][DEBUG]: (0.1ms) commit transaction
=> true
개체를 쿼리 할 때 확인됩니다.
UnconfirmedImage.all
[13891][12:33:59.525 +0000][DEBUG]: UnconfirmedImage Load (0.3ms) SELECT "images".* FROM "images" WHERE "images"."type" IN ('UnconfirmedImage')
=> #<UnconfirmedImage id: 2, url: "foo", type: "UnconfirmedImage", created_at: "2014-02- 17 12:31:15", updated_at: "2014-02-17 12:31:15", user_id: 1>]>
ConfirmedImage.all
[13891][12:33:39.646 +0000][DEBUG]: ConfirmedImage Load (0.2ms) SELECT "images".* FROM "images" WHERE "images"."type" IN ('ConfirmedImage')
=> #<ActiveRecord::Relation []>
누구나 최선의 해결책을 제안 할 수 있습니까? 이것이 예상되는 동작인지 또는 레일스의 버그인지 확실하지 않습니다.
감사합니다.
어디서나 정의 된 'default_scope'가 있습니까? – aceofspades
@aceofspaces 나는 그렇지 않습니다. –