2013-02-08 9 views
16

私は2つの関連モデルを持っています - ActivityStepとしましょう。 Activity has_many :stepsおよびStep belongs_to :activityは、stepsの表がactivity_idの列を持つことを意味します。Railsモデルの1つのフィールドの変更を防ぐ

これはHobo 1.3のため、Rails 3.0です。

Step作成後の後に別のActivityにステップを移動することはできません。 activity_idフィールドを変更したくありません。

編集フォームからフィールドを削除しましたが、より強い制約があります。基本的には、updatecreateにはない)で列が触れられていないことを検証したいと思います。 HoboのドキュメントはHobo内のソートについて何も示唆していないので、私はRails validationsを見ていますが、これまでのところ私が覚えている "これを更新するだけです"という制約や、変化。

答えて

29

アトリビュートをattr_readonly :your_field_nameでread_onlyとして宣言できます。 ただし、この属性を書き込もうとするとエラーは発生しません。この属性は暗黙のうちに失敗します。 (この属性は、すべてのSQL-アップデートでは無視されます)

別のオプションは、この場合の検証を書くために、かもしれないが、次のようになります。

class Step < ActiveRecord::Base 
    validate :activity_id_not_changed 

    private 

    def activity_id_not_changed 
    if activity_id_changed? && self.persisted? 
     errors.add(:activity_id, "Change of activity_id not allowed!") 
    end 
    end 
end 

persisted?これがない場合は、trueを返します新しい記録は破壊されない。

リンク:

http://api.rubyonrails.org/classes/ActiveRecord/ReadonlyAttributes/ClassMethods.html#method-i-readonly_attributes

http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-persisted-3F

+0

'attr_readonly'広告された通りに働く、bアプリの別の面にシワが発生している可能性があります。私は明日の検証アプローチを試し、それがうまくいくかどうかを見てみましょう。 – pjmorse

+0

アプリケーションのどこか他の場所でIDを本当に変更する必要がある場合は、次のような検証方法でもIDを変更する必要があります: 'step.save(:validate => false)' – Deradon

+0

他の場所では変更の問題はありません。それはオブジェクトのコピーです。 (つまり、 'Activity'をすべての' Steps'をコピーした形で仮想的にコピーしたとしたら、それは何らかの理由で動作していませんし、コピーのコードにこの変更が壊れたかどうかを十分に深く掘り下げていません。) – pjmorse

1

私はあなたがホーボー権限システムであまりにもこれを行うことができると思います。たとえばhttp://hobocentral.net/manual/permissions

def update_permitted? 
    acting_user.administrator && !activity_id_changed? 
end 
関連する問題