Ruby on rails 使任何订单都可以链接

Ruby on rails 使任何订单都可以链接,ruby-on-rails,ruby,sorting,model,named-scope,Ruby On Rails,Ruby,Sorting,Model,Named Scope,我想根据一个复杂的标准对我的Person模型对象进行排序,这个标准不能在单个查询中进行总结,因此也不能在命名范围中进行总结。现在我使用的类方法如下: def Person.very_complicated_sorting Person.all.sort { |x,y| x.bunch_of_calculations <=> y.bunch_of_calculations } end 其中,最高的和最小的是两个命名范围。您的非常复杂的排序应该在您的个人模型中 你不能写Person

我想根据一个复杂的标准对我的
Person
模型对象进行排序,这个标准不能在单个查询中进行总结,因此也不能在命名范围中进行总结。现在我使用的类方法如下:

def Person.very_complicated_sorting
  Person.all.sort { |x,y| x.bunch_of_calculations <=> y.bunch_of_calculations }
end

其中,
最高的
最小的
是两个命名范围。

您的
非常复杂的排序
应该在您的
个人
模型中

你不能写
Person。所有的
都在方法内部,否则就不能链接

只要保持:

def self.very_complicated_sorting
  sort_by { |x,y| x.bunch_of_calcultaions <=> y.bunch_of_calculations }
end
def self.非常复杂的排序
按{x,y | x.bunch_of_calcultains y.bunch_of_calculations}对_进行排序
结束

您的
非常复杂的排序应该在您的
Person
模型中

你不能写
Person。所有的
都在方法内部,否则就不能链接

只要保持:

def self.very_complicated_sorting
  sort_by { |x,y| x.bunch_of_calcultaions <=> y.bunch_of_calculations }
end
def self.非常复杂的排序
按{x,y | x.bunch_of_calcultains y.bunch_of_calculations}对_进行排序
结束

不幸的是,这是不可能的

命名作用域的工作方式是“惰性地”构建一组组合的SQL参数,在您实际尝试使用它们之前,不会对这些参数进行计算。例如,以下命名作用域链:

people = Person.tallest.youngest
不会导致运行任何数据库查询,它实际上会导致
ActiveRecord::NamedScope
对象存储在
people
变量中。只有在访问或迭代该对象时,才会运行SQL并加载对象


您的问题是排序方法不是用SQL表示的,而是一组Ruby条件。当Rails到达您的
sort\u by
时,它必须去获取并实例化
Person
对象,以便在它们上运行您的条件。完成后,您将拥有对象的
数组
,而不再是
名称范围
对象。

不幸的是,这是不可能的

命名作用域的工作方式是“惰性地”构建一组组合的SQL参数,在您实际尝试使用它们之前,不会对这些参数进行计算。例如,以下命名作用域链:

people = Person.tallest.youngest
不会导致运行任何数据库查询,它实际上会导致
ActiveRecord::NamedScope
对象存储在
people
变量中。只有在访问或迭代该对象时,才会运行SQL并加载对象


您的问题是排序方法不是用SQL表示的,而是一组Ruby条件。当Rails到达您的
sort\u by
时,它必须去获取并实例化
Person
对象,以便在它们上运行您的条件。完成后,您将拥有对象的
数组
,而不再是
名称范围
对象。

如果您对数据库库使用ActiveRecord而不是ActiveRecord,这是可能的。它允许您在模型上使用来创建操作(包括哪些模型)的方法;只要你的方法返回一个数据集,你就可以随意链接它们。例如:

class Person < Sequel::Model
  def_dataset_method :active_only do
    filter :active=>true
  end
  def_dataset_method :sort_much do
    order :name, :age.desc
  end
end

active_peeps = Person.active_only.sort_much
peeps_active = Person.sort_much.active_only
class-Persontrue
结束
定义数据集方法:排序
顺序:name,:age.desc
结束
结束
active\u peeps=Person.active\u only.sort\u much
peeps\u active=Person.sort\u much.active\u only
要留在Dataset land中,您需要只使用可以表示为SQL的方法。您不能期望从数据库中请求一些记录,然后对它们执行复杂的仅限Ruby的逻辑(例如,按照Ruby哈希中查找的
object\u id
对它们进行排序),然后继续对结果数组执行SQL。Ruby不在您的数据库上运行(除了)


或者,您可以直接访问Ruby数组,然后以任意顺序链接您喜欢的任何Ruby方法,如果它们都在数组和返回数组上操作的话。您必须在代码中明确决定何时从数据库中获取结果,然后再对阵列进行操作。

如果对数据库库使用ActiveRecord而不是ActiveRecord,这是可能的。它允许您在模型上使用来创建操作(包括哪些模型)的方法;只要你的方法返回一个数据集,你就可以随意链接它们。例如:

class Person < Sequel::Model
  def_dataset_method :active_only do
    filter :active=>true
  end
  def_dataset_method :sort_much do
    order :name, :age.desc
  end
end

active_peeps = Person.active_only.sort_much
peeps_active = Person.sort_much.active_only
class-Persontrue
结束
定义数据集方法:排序
顺序:name,:age.desc
结束
结束
active\u peeps=Person.active\u only.sort\u much
peeps\u active=Person.sort\u much.active\u only
要留在Dataset land中,您需要只使用可以表示为SQL的方法。您不能期望从数据库中请求一些记录,然后对它们执行复杂的仅限Ruby的逻辑(例如,按照Ruby哈希中查找的
object\u id
对它们进行排序),然后继续对结果数组执行SQL。Ruby不在您的数据库上运行(除了)


或者,您可以直接访问Ruby数组,然后以任意顺序链接您喜欢的任何Ruby方法,如果它们都在数组和返回数组上操作的话。您必须在代码中明确决定何时从数据库获取结果,然后再对数组进行操作。

在旁注中,
sort\u by
只为块提供一个参数,而不是两个参数。我猜你的意思是像
.sort_by{x | x.bunch_of_calculations}
我的意思是“sort”,对不起!(编辑)在旁注中,
sort_by
只为块提供一个参数,而不是两个。我猜你的意思是像
.sort_by{x | x.bunch_of_calculations}
我的意思是“sort”,对不起!(编辑)它在我的
Person
模型中…我想要一个类方法,而不是实例方法!我的错…没有看到自己。
。这个建议也很好,即使它没有回答问题!:)至少,这启用了链接:)它在我的
Person
模型中…我想要一个类方法,