2012-02-26 63 views
1

我知道在模型中獲取current_user是一個壞主意。我也知道有一種方法可以做到這一點(使用Thread)。但是,我不想這樣做(這當然是一個壞主意),所以我想對實現這個不同的方式有一個意見。在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

如何使用虛擬屬性?我的意思是在Clan模型中使用名爲user_id的虛擬屬性,並在創建Clan時設置虛擬屬性。虛擬屬性將可以從self.user_id – mohamagdy 2012-02-26 22:03:48

回答

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更乾淨的代碼。

您當然需要將leader_id作爲字段添加到您的clans表中。

+0

很好的解決方案thanx :)訪問只是一個通知,它也需要在這裏'attr_accessor:leader'。 – Spyros 2012-02-26 22:29:46

+0

@SpyrosP:不要使用'attr_accessor'。領導者應該被保存爲一個家族協會。看到我更新的答案。 – 2012-02-27 01:23:24

+0

啊,我明白你的意思了,但我真的不想擁有leader_id。我實際上是通過另一種模式(clan_membership)來拯救我的成員,因爲還有其他的等級。 – Spyros 2012-02-27 01:45:37