Ruby on rails 接下来,在ActiveRecord中添加previous,而不引用列
我在include模块中定义了如下范围:Ruby on rails 接下来,在ActiveRecord中添加previous,而不引用列,ruby-on-rails,activerecord,scope,Ruby On Rails,Activerecord,Scope,我在include模块中定义了如下范围: module ActsAsAdjacent def self.included(base) base.send(:scope, :next, lambda {|id| {:conditions => ["id > ?",id], :order => "id ASC", :limit => 1}}) base.send(:scope, :previous, lambda {|id| {:co
module ActsAsAdjacent
def self.included(base)
base.send(:scope, :next, lambda {|id| {:conditions => ["id > ?",id],
:order => "id ASC", :limit => 1}})
base.send(:scope, :previous, lambda {|id| {:conditions => ["id < ?",id],
:order => "id DESC", :limit => 1}})
end
模块动作
def自带(基本)
send(:scope,:next,lambda{id}{:conditions=>[“id>?”,id],
:order=>“id ASC”,:limit=>1})
send(:scope,:previous,lambda{id}{:conditions=>[“id<?”,id],
:order=>“id DESC”,:limit=>1})
结束
,其思想是您可以将下一个、上一个功能混合到任何ActiveRecord::Base子类中。(以上是一些例子的变体)
然而,上面提到的一个明显的缺点是,它假设了一个特定的列“id”,而该列在某些情况下可能不存在,或者可能使用了不同的排序顺序
是否有一种方法可以根据当前的排序顺序执行下一步、上一步,或者记录在数据库中的排列方式
比如在下面的例子中
class User < ActiveRecord::Base
default_scope :order => 'users.name ASC'
include ActsAsAdjacent
class用户'users.name ASC'
包括ACTSAS
ACTSASSINATION将自动使用该排序顺序返回下一个、上一个
我想id总是存在的,但它可能不会按此排序。我认为这是对作用域的滥用。这个怎么样
module ActsAsAdjacent
def next_by(column)
self.class.where("#{column} > ?", send(column)).order(column).first
end
# .. and the obvious inverse for previous_by
end
# Call it like this:
some_user.next_by(:id)
实际上,:next作用域甚至不适用于带有默认\u作用域的id,在这种情况下,它总是按字母顺序返回第一个名字记录。无法理解。您的:next和:previous方法根本不是作用域。它们只返回一个方法,应该在实例上调用,而不是像实际作用域那样调用类。这很有效-我不知道为什么我没有想到将列名作为字符串传递。(哦,好的)。你说我上面的望远镜是误用的。想弄明白。你能解释一下为什么tadman的答案中的作用域是有效的吗?这里:另一个问题中的答案与将直接在类上调用的方法有关:
User.by\u name(name)
,而你的方法是在某个实例上调用的some\u User.next\u by(attribute)
。有道理?