Ruby on rails Rails范围中的第一个或限制

Ruby on rails Rails范围中的第一个或限制,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我有以下范围: scope :user_reviews, lambda { |user| where(:user_id => user) } 我将此应用于控制器: def show @review = @reviewable.reviews.user_reviews(current_user).first || Review.new end 第一个限制搜索当前用户的一个且唯一的评论。现在,我尝试编写一个新的范围user\u review,我尝试了许多方法将user\u review

我有以下范围:

scope :user_reviews, lambda { |user| where(:user_id => user) }
我将此应用于控制器:

def show
  @review = @reviewable.reviews.user_reviews(current_user).first || Review.new
end
第一个
限制搜索当前用户的一个且唯一的评论。现在,我尝试编写一个新的范围
user\u review
,我尝试了许多方法将
user\u review
范围与
first
链接起来,但无法得到它。大概是这样的:

scope :user_reviews, lambda { |user| where(:user_id => user) }
scope :user_review, lambda { |user| user_reviews(user).first }
我知道上面的
user\u review
是错误的,但我只是想告诉你们我在做什么

我应该如何正确地写这个


谢谢。

@Victor,坚持你原来的想法吧。使用
scope:user_reviews,lambda{user|where(:user_id=>user)}
并调用
user_reviews.first
。这没什么错

绝对不要定义返回单个对象的范围。作用域应该是可链接的。

我还使用了以下方法:

  def self.user_review(user)
    self.user_reviews(user).first
  end

我觉得这个用例非常常见

我们可以通过以下方式解决此问题:

scope :user_reviews, lambda { | user_id | where(:user_id => user_id) }
然后在模型中有
user\u review
as类方法

def self.user_review(user_id)
    user_reviews(user_id).first
end

现在您可以调用
user\u review
,它将返回一条记录。

我认为您的记录没有什么大问题。只返回一个对象的作用域不再是真正的作用域。您可以在作用域块内定义方法,但在这种情况下这是多余的(例如,
def first
方法,它只需对作用域结果调用
.first
。@TomL,您的想法行得通。请把它作为一个答案,这样我可以标记它,给你学分。谢谢。“绝对不要定义返回单个对象的范围。范围应该是可链接的。”我完全同意,我想补充一点,这样使用
scope
听起来像是概念上的错误。我认为使用
has\u one/belient\u to
关系是一个更好的选择
def self.user_review(user_id)
    user_reviews(user_id).first
end