2012-10-25 31 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) }