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