Rails范围中的第一个或限制

时间:2012-10-25 14:18:37

标签: 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

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是错误的,但只是想告诉大家我想做什么。

我应该如何正确地写这个?

感谢。

4 个答案:

答案 0 :(得分:9)

@Victor,坚持你最初的想法。使用scope :user_reviews, lambda { |user| where(:user_id => user) }并致电user_reviews.first。没有错。

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

答案 1 :(得分:0)

我也用过这个:

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

答案 2 :(得分:0)

      scope :user_reviews, ->(user) { where(user_id: :user) }

答案 3 :(得分:0)

我觉得这种用例非常普遍。

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

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

,然后在模型中将user_review作为类方法

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

现在您可以调用user_review,它将返回一条记录。