2011-10-16 15 views
0

我用以下代碼抓取特定用戶的開放存儲桶列表。過濾未知數據的導軌模型

@open_buckets = Buckets.order("buckets.id ASC").where(:user_id => @user.id) 

還有一個用戶的私人桶的概念。我只想要在登錄用戶是存儲桶的所有者時返回專用存儲桶。私人領域是一個布爾值。我能以某種方式更改我的查詢,以便所有用戶都可以獲得公共存儲區,只有所有者可以獲得他們的私人存儲區和公共存儲區?

我唯一想到的就是檢查登錄用戶是否與請求桶的用戶相同,並執行不同的查詢。像下面的東西。

if :session["user_id"] => :user_id 
    @open_buckets = Buckets.order("buckets.id ASC").where(:user_id => @user_id) 
else 
    @open_buckets = Buckets.order("buckets.id ASC").where(:user_id => @user_id).where(:private => true) 

感謝

回答

2

好吧,雖然我同意用一個視圖(或一個列表/分,更具體),以顯示兩種不同類型的信息,這裏是一個辦法,你可以做你在做什麼尋找:

@buckets = Buckets.order("buckets.id ASC").where(:user_id => @user_id, :private => false) 
@buckets += @buckets.where(:private => true) if current_user.id == user.id 

您還可以創建一些很酷的範圍在模型中,它應該是處理這種半複雜的邏輯,也更充分地利用您的關聯:

@user = User.find(params[:user_id]) 
@buckets = @user.buckets.public 
@buckets += @user.buckets.private if @current_user == @user 
respond_with @buckets = @buckets.order("buckets.id asc") 

Buckets型號:

scope :public, where(:private => false) 
scope :private, where(:private => true) 

作爲一個側面說明,模型類的名字應該永遠是單數。在你的例子中你有Buckets,所以如果這不是一個錯字,那麼我建議回去改變它,如果這是可行的。這將進一步導致混亂,尤其是對於您的應用程序的未來開發人員。

+0

關於不使用2個視圖。只有1個視圖,但來自控制器的數據可能有更多行,具體取決於當前登錄的用戶。如果所有者用戶正在查看他自己的存儲區列表,則還會啓用更多按鈕。你認爲最好有兩個視圖各自採取不同的行動嗎? 1爲所有者,另一個爲其他人?是桶是一個錯字。它是單數。謝謝你的提醒。我也會檢查範圍內容。 – Brian

+1

我喜歡brickers作用域 - 然後你可以在控制器上進行模型測試 - 總是更好:) –

+0

@Brian請在我上面的代碼中查看'respond_with',我更新它以添加'@ buckets =',這樣它就會實際上工作。 – bricker

0

A named_scope(或只是scopein Rails 3)可以做到這一點。

class Bucket 
    ... 

    named_scope :visible_buckets_for, lambda {|user| { :conditions=>["private = 'f' OR (private = 't' and user_id = ?)", current_user.id], :order=>"buckets.id ASC" } } 

其中「CURRENT_USER」是你要獲取的當前登錄用戶的id任何方法,並't'true值的特定DB-表示。有些數據庫使用「true」或任何非零數字。

然後調用它像:

> Bucket.visible_buckets_for(current_user) 
=> [<#Bucket1>, <#Bucket2>, <#Bucket3> ... ] 

...這是Bucket對象的數組,通過id排序。

您可以將任何用戶傳遞給該命名範圍,以防您需要爲當前用戶查找更多信息。