2012-10-25 64 views
3

我有以下範圍:第一或Rails的範圍限制

scope :user_reviews, lambda { |user| where(:user_id => user) } 

我在控制器中應用此:

def show 
    @review = @reviewable.reviews.user_reviews(current_user).first || Review.new 
end 

first是限制搜索當前用戶的唯一評審。現在我試着寫一個新的示波器user_review,我嘗試了很多方法將user_reviews示波器與first連接起來,但卻無法得到它。事情是這樣的:

scope :user_reviews, lambda { |user| where(:user_id => user) } 
scope :user_review, lambda { |user| user_reviews(user).first } 

我知道上面user_review是錯誤的,但只是想你展示傢伙什麼,我試圖做的。

我該如何正確寫入?

謝謝。

+1

我沒有看到一個很大的問題,你有什麼。一個只返回一個對象的範圍不再是一個範圍。您可以在作用域的塊中定義方法,但在這種情況下這可能是多餘的(例如,在範圍結果中簡單調用'.first'的'def first'方法)。 –

+0

@TomL,你的想法有效。請把它作爲答案,以便我可以標記並給你信用。謝謝。 – Victor

回答

3

@Victor,只是堅持你最初的想法。使用scope :user_reviews, lambda { |user| where(:user_id => user) }並致電user_reviews.first。沒有錯。

絕對不要定義返回單個對象的作用域。範圍應該是可鏈接的。

+0

「_Definitely不要定義返回單個對象的作用域,作用域應該是可鏈接的。」我完全同意,我想補充一點,這聽起來像是使用'scope'的概念錯誤。我認爲使用'has_one/belongs_to'關係會是更好的選擇 –

0

我也用這個:

def self.user_review(user) 
    self.user_reviews(user).first 
    end 
0
 scope :user_reviews, ->(user) { where(user_id: :user) }