1

update_attributes の STI を実行するときに、新しいクラス タイプに基づいて属性を検証する方法があるかどうかを知りたいですか?

たとえば、私が持っているとします:

class A < ActiveRecord::Base
end
class B < A
    validates :attribute_z, :presence => true
end 
class C < A
    validates :attribute_x, :presence => true
    validates :attribute_y, :presence => true 
end

私が実行した場合(レールが実装されている方法):

b = A.find('b-id')
b.update_attributes({ 'type' => 'C', :attribute_x => 'present', :attribute_y => 'present', :attribute_z => nil }) # will return false with errors on 'attribute_z must be present'

私は#becomesで試しました:

b = A.find('b-id')
b = b.becomes(C)
b.update_attributes({ 'type' => 'C', :attribute_x => 'present', :attribute_y => 'present', :attribute_z => nil })
# this works partially, because the validations are ok but when i look to console i get something like: 
UPDATE "as" SET "type" = 'c', "attribute_z" = NULL, "attribute_y' = 'present', 'attribute_x' = 'present' WHERE "as"."type" IN ('C') AND "as"."id" = 'b-id' 
# which is terrible because it's looking for a record of B type on the C types.
4

2 に答える 2

0

このトピックに関連しています 変更された ActiveRecord 属性のコールバック? 、 type 属性に行われた割り当てをキャッチし、 become メソッドを使用して "self" を異なるクラス (A、B、または C) にすることができます。そのため、find メソッドを使用するたびに、DB から取得したデータ (「b-id」で識別) を新しいモデル インスタンスに入力し、必要に応じてモデル インスタンスを別の型に自動的に強制キャストします。

それは役に立ちますか?

于 2013-01-14T18:12:18.953 に答える
0

私は解決策を作成しました: https://gist.github.com/4532583、条件はレールによって内部的に追加されるため (https://github.com/rails/rails/blob/master/activerecord/lib/active_record/ inheritance.rb#L15) タイプが指定された場合にタイプを変更する新しい「update_attributes」メソッドを作成しました。:)

于 2013-01-14T22:51:12.573 に答える