2011-06-28 28 views
0

我的架構看起來像這樣(簡化):我擁有不同特權的用戶,創建經歷特定生命週期(創建,審閱,關閉,等等)的帖子。Rails:動態:finder_sql可能嗎?

用條款說話,class User has_many :posts,但我希望用戶根據他們的權限查看帖子。如果用戶有特權,他應該能夠看到所有帖子,如果沒有,我希望他只能看到已經查看過的帖子以及他自己的帖子。

現在,Post模型有一個類方法for_user(user),它簡單地檢查用戶權限並返回相應的帖子。我明白了,這是probalby不是Rails的方式來做到這一點,我想知道,如果它可以做這樣的事情:

class User 
    has_many :posts, :finder_sql => finder 
    #[...] 
    def finder 
    if self.has_privileges? #simplified... 
     all 
    else 
     where('[...]') 
    end 
    end 

不幸的是,這並不能作爲軌工作預計:finder_sql是一個只有字符串和一個字符串。有沒有其他的方式來創建所需的行爲?

回答

1

我正在做一些非常類似的事情,在我目前的應用程序中,我發現使用CanCan makes it very easy。當然,將特權邏輯轉移到CanCan可能需要更多努力,但它確實增加了很多靈活性。如果沒有別的,你可以看看源代碼,看看他是如何做到的。

0

一種可能的方式是創建一個別名法「all_posts」,然後定義使用它自己的帖子方法:

class User 
    has_many :all_posts, :class_name => "Post" 

    def posts 
     self.has_priviledges? ? self.all_posts : self.all_posts.where(...) 
    end 
end 

這有失去一些緩存的ActiveRecord爲你做的缺點。例如,如果你調用了user.all_posts兩次,只有第一個調用sql,但是如果使用where子句,調用user.posts兩次可能會同時調用sql。

0

而不是使用has_many協會(添加了一堆的setter方法,以及干將),簡單地定義一個方法(你已經或多或少已經完成):

def User < ActiveRecord::Base 

    has_many :posts # written by the user 

    # Posts the user can see 
    def posts_visible_to 
    if has_privileges? 
     Post.all 
    else 
     posts 
    end 
    end 

end 

PS你拼寫錯誤的特權...... :)