我有以下范围:
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
是错误的,但只是想告诉大家我想做什么。
我应该如何正确地写这个?
感谢。
答案 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
,它将返回一条记录。