Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 接下来,在ActiveRecord中添加previous,而不引用列_Ruby On Rails_Activerecord_Scope - Fatal编程技术网

Ruby on rails 接下来,在ActiveRecord中添加previous,而不引用列

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

我在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| {: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)
。有道理?