簡體   English   中英

使用未知數據過濾rails模型

[英]Filtering rails model with unknown data

我正在使用以下代碼獲取特定用戶的打開存儲桶列表。

@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)

謝謝

好吧,雖然我不同意使用一個視圖(或一個列表/部分,更具體地說)來顯示兩種不同類型的信息,但這里有一種方法可以做你想要的:

@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 ,所以如果這不是一個錯字,那么我建議回去並改變它,如果這樣做是可行的。 這將導致進一步的混亂,特別是對於您的應用程序的未來開發人員。

named_scope (或只是Rails 3中的 scope )可以做到這一點。

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'是特定於DB的true值表示。 某些DB使用“true”或任何非零數字。

然后你稱之為:

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

...這是一個Bucket對象數組,按id排序。

您可以將任何用戶傳遞到該命名范圍,以防您需要查找的不僅僅是當前用戶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM