2012-02-26 5 views
1

モデルでcurrent_userを取得することは悪いことです。私はまたそれを行う方法があることを知っています(スレッドで)。しかし、私はこのようにしたくない(それは確かに悪い考えです)、私はこれを別の方法で達成することについて意見を述べたいと思います。after_createフィルタで現在のユーザを取得する

ユーザーは、一族を作成することができ、作成すると、彼はリーダーでなければなりません。クランモデルは:

class Clan < ActiveRecord::Base 
    after_create :assign_leader 

    # the person who created the clan is the leader 
    def assign_leader 
     self.clan_memberships << ClanMembership.new(:user_id => ???, :role => 'leader') 
    end 
end 

私はちょうどコントローラのメンバーシップを作成することができます知っている:しかし、私はそのようなフィルタはトランザクションとして動作し、私は非常にこれのためのフィルタを好むだろう。しかし、実際にここでこれを行う正しい、非ハッカー的な方法がありますか?

+0

仮想属性の使用はどうですか?私は、user_idという名前のClanモデルで仮想属性を使用し、Clanを作成する際に仮想属性を設定することを意味します。仮想属性はself.user_idからアクセス可能です – mohamagdy

答えて

4

コントローラのリーダーを割り当てます。

@clan.leader = @clan 
@clan.save 

次に、あなたのモデルは次のようになります。

class Clan < ActiveRecord::Base 
    belongs_to :leader 
    after_create :assign_leader 

# the person who created the clan is the leader 
def assign_leader 
    self.clan_memberships.create(:user => self.leader) 
end 

これは、あなたではなく、別のクエリを実行するより、指導者のためのclan.leaderをチェックすることができ意味それが誰であるかを見つけるためにclan.membershipsのような協会。また、assign_leaderのコードがきれいになります。

clansテーブルにフィールドとしてleader_idを追加する必要があります。

+0

すてきなソリューションありがとう:)ここには「attr_accessor:leader」も必要です。 – Spyros

+0

@SpyrosP: 'attr_accessor'は使わないでください。指導者は一族上の協会として救われるべきです。私の更新された答えを見てください。 –

+0

ああ、私はあなたが意味するものを参照してくださいが、私は本当にleader_idを持っていないと思う。他のランクもあるので、私は実際にメンバーを別のモデル(clan_membership)で保存します。 – Spyros

関連する問題