Ruby on rails 4 Rails作用域lambda和2个where子句

Ruby on rails 4 Rails作用域lambda和2个where子句,ruby-on-rails-4,lambda,scope,Ruby On Rails 4,Lambda,Scope,我有这个,它很好地为我提供了下一个和上一个项目: scope :next, lambda {|id| where("id > ?",id).order("id ASC") } scope :previous, lambda {|id| where("id < ?",id).order("id DESC") } def next Item.next(self.id).first end def previous Item.previous(self.id).first end

我有这个,它很好地为我提供了下一个和上一个项目:

scope :next, lambda {|id| where("id > ?",id).order("id ASC") } 
scope :previous, lambda {|id| where("id < ?",id).order("id DESC") }

def next
 Item.next(self.id).first
end

def previous
 Item.previous(self.id).first
end
scope:next,lambda{id | where(“id>?”,id).order(“id ASC”)}
范围:previous,lambda{id | where(“id<?”,id).order(“id DESC”)}
def下一个
Item.next(self.id).first
结束
def先前版本
项目。上一个(self.id)。第一个
结束
我认为:

<%= link_to @item.previous, title: "xxx" do %>
<span class="glyphicon glyphicon-chevron-left" style="color:#eeeeee"></span>
<% end %>

我想增强上面的功能,这样我不仅可以得到下一个/上一个项目,还可以得到下一个/上一个具有相同:source\u id(我的项目具有source\u id)的项目

在此处发现两个类似的问题,但无法将其应用于我的示例:


蒂亚

只需在作用域中添加条件即可

scope :next, lambda {|id, source_id| where("id > ? AND source_id> ?", id, source_id).order("id ASC") } 
def next
  Item.next(self.id, self.source_id).first
end
如果只想使用
id
保留旧范围,您有很多选项——使用不同的名称创建一个新范围,检查lambda块中的
source\u id
是否为
nil
,并为其提供一个默认值(或更改where子句)

不过,如果您只是使用范围来定义下一个/上一个方法,我建议您不要费心处理范围。你可以直接和我谈谈

def next
  Item.where("id > ?", self.id).first
end

更普遍的做法是在处对上一个范围进行
创建\u比较,因为
id
可能是一个随机数(例如隐藏购买的总数)

非常感谢!哪一个更好:有范围还是没有范围?没有代码,对我来说更简单。也许它也更快?实际上是完全相同的速度——如果你看一下作用域上的Rails指南,它们只是类方法的静态糖。出于形式上的原因,我会说没有,因为如果你永远不打算单独使用作用域,那么写一个作用域是没有意义的。