【问题标题】:Sort by a model method in a scope按范围内的模型方法排序
【发布时间】:2017-05-18 09:12:19
【问题描述】:

在我的模型中,我有一个方法,它获取对象的 last_name 和 first_name 列并将它们连接成一个字符串。

def name
  last_name + " " + first_name
end

我想定义一个可以通过该方法对我的对象进行排序的范围。使用我的方法如何去做呢?我不想定义一些首先按 last_name 排序的范围,然后在范围内按 first_name 排序(如果可能的话)。我的理解是您只能在 rails 框架中的实际列范围内?不对吗?

这是我写的,但显然两者都不起作用,因为我的 AdminUser 表中没有 name 字段。不知道为什么第二个不起作用,但我猜:name_field 不起作用,因为它实际上不在模型/数据库中作为列。

scope :sorted, lambda { order("name ASC")}
scope :sorted, lambda { :name_field => name, order("name_field ASC")}

【问题讨论】:

标签: ruby-on-rails


【解决方案1】:

不幸的是,不能直接从 Ruby/Rails 到 SQL 执行此操作。你可以通过两种方式实现你想要的

您可以将所有用户加载到内存中并在 Ruby 中对其进行排序

User.all.to_a.sort_by(&:name)

或者您可以在 SQL 中这样定义订单

ORDER BY CONCAT(users.last_name, ' ', users.first_name) ASC;

在 Rails 中,您必须执行以下操作

scope :sorted, -> { 
  order("CONCAT(users.last_name, ' ', users.first_name) ASC") 
}

请注意,这可能无法在 DB 之间移植。

【讨论】:

  • 太棒了!谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
相关资源
最近更新 更多