2011-07-06 6 views
0

私は参加者が多いアクティビティモデルを持っており、アクティビティとその参加者を更新するときに必ず参加者が存在するようにしたいと思います。私は、トリックを行います私の活動のモデルで、次の方法があります。Railsはロードされたときにのみ関連付けを有効にします

def must_have_participant 
    if self.participants.size == 0 || self.participants.size == self.participants.to_ary.find_all{ |p| p.marked_for_destruction? }.count 
    self.errors[:base] << I18n.t(:msg_activity_must_have_participant) 
    end 
end 

問題は、私は単に私が避けたいのですが、独自の活動を更新していた場合、参加者は遅延ロードされているということです。私は、次の代替を試しましたが、ロードされた? :_destroyフラグを使用してすべての参加者を削除すると、falseを返します。

def must_have_participant 
    if self.new_record? || self.participants.loaded? 
    if self.participants.size == 0 || self.participants.size == self.participants.to_ary.find_all{ |p| p.marked_for_destruction? }.count 
     self.errors[:base] << I18n.t(:msg_activity_must_have_participant) 
    end 
    end 
end 

ロードの代替手段はありますか?参加者が更新されるかどうかを知るために使うことができますか?

答えて

0

参考のために私はそうのような方法を改正しました:

def must_have_participant 
    if self.new_record? || self.association(:participants).loaded? 
    if self.participants.size == 0 || self.participants.size == self.participants.select{ |p| p.marked_for_destruction? }.size 
     self.errors[:base] << I18n.t(:msg_must_have_participant) 
    end 
    end 
end 
0

私が作成した最近の検証では、このようなことをしました。元のレコードを検索し、元の値を新しい値と照合しました。私が代わりに、すべての参加者のレコードをフェッチし、それらの大きさをチェックするparticipant_idsのサイズを確認し

orig_rec = self.find(id) 
    if participant_ids.size != orig_rec.participant_ids.size 

注:私のコードはここにあなたのために働くますが保証は、あなたのアプリケーションのための私のコードではありません。それはより効率的でなければなりません。

これを行うには何らかの機能が組み込まれているかどうかわかりませんが、ルビーではこれ以上の機能がないとわかりません。

関連する問題