Rails中的复杂排序

时间:2015-03-28 21:38:18

标签: ruby-on-rails sorting

在我的应用程序中,有一个Membership模型,其属性为username_or_email,用于邀请用户加入系统。当用户接受邀请时,Membership对象将更新为与具有User属性的新name对象的关系。现在我想在一个视图中对每个Membership对象进行排序,并将其显示如下:

  1. 如果已经注册了用户,则从已加入的User对象显示名称属性。
  2. 如果只有受邀用户,请显示username_or_email属性。
  3. 如何通过两列按字母顺序轻松对其进行排序?

1 个答案:

答案 0 :(得分:0)

以下是您可以这样做的方法(让我们假设使用PostgreSQL)

处理查询的成员资格范围

# class Membership
 def self.ordered_by_formatted_name
   joins("LEFT JOIN users ON users.id = memberships.user_id").
     order("COALESCE(users.name, memberships.username_or_email)")
 end

显示逻辑的成员资格的实例方法

# class Membership
def formatted_name
  user ? user.name : username_or_email
end

使用示例

@memberships = Membership.ordered_by_formatted_name.preload(:user)

<% @memberships.each do |m| %>
  <%= m.formatted_name %>
<% end %>