7

我有以下范围:

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

4 回答 4

15

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

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

于 2012-10-29T20:04:59.227 回答
0

我也用过这个:

  def self.user_review(user)
    self.user_reviews(user).first
  end
于 2012-10-31T16:01:48.440 回答
0
      scope :user_reviews, ->(user) { where(user_id: :user) }
于 2013-12-16T07:10:01.330 回答
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了,它会返回一条记录。

于 2018-09-06T17:19:28.997 回答