鉴于以下AR模型,我希望在给定任务句柄时按姓氏按字母顺序对用户进行排序:
#user
has_many :assignments
has_many :tasks, :through => :assignments
#assignment
belongs_to :task
belongs_to :user
#task
has_many :assignments
has_many :users, :through => :assignments
我想获得一项任务,然后导航到其指定的用户,并按字母顺序对用户列表进行排序。
我一直认为我应该能够将:order
子句添加到has_many :users, :through => :assignments
这样:
#task.rb
has_many :assignments
has_many :users, :through => :assignments, :order => 'last_name, first_name'
然而这不起作用。
如何在给定任务时按last_name
对用户进行排序?
答案 0 :(得分:68)
由于在Rails 4中不推荐使用条件参数,因此应该使用范围块:
has_many :users, -> { order 'users.last_name, users.first_name' }, :through => :assignments
答案 1 :(得分:37)
Rails 3.x版本:
has_many :users, :through => :assignments, :order => 'users.last_name, users.first_name'
更新:这仅适用于Rails 3.x(也许在此之前)。 4+以上,请参阅其他答案。
答案 2 :(得分:12)
M.G.Palmer's
方法运行良好,但涉及表名。有一种更好的方法:
has_many :users, :through => :assignments, :order => [ :last_name, :first_name ]
答案 3 :(得分:7)
这对你有用吗?
# User.rb
class User < ActiveRecord::Base
default_scope :order => 'last_name ASC'
...
end
您可以定义其他命名范围,以便何时排序需要不同。
http://ryandaigle.com/articles/2008/11/18/what-s-new-in-edge-rails-default-scoping
答案 4 :(得分:6)
这对我有用(Rails 4.2)
不保留在直通地图上应用排序,也就是说这还不足以让这些类型有序:
has_many :disk_genre_maps,
-> {order('disk_genre_map.sort_order')},
:inverse_of => :disk,
:dependent => :destroy,
:autosave => true
has_many :genres, # not sorted like disk_genre_maps
:through => :disk_genre_maps,
:source => :genre,
:autosave => true
所以我在每个实例中覆盖这个:
def genres # redefine genres per instance so that the ordering is preserved
self.disk_genre_maps.map{|dgm|dgm.genre}
end
为了完成分配的工作,这应该是这样的(未经测试的)
def genres= some_genres
self.disk_genre_maps = some_genres.map.with_index do |genre, index|
DiskGenreMap.new(disk:self, genre:genre, sort_order:index)
end
end
答案 5 :(得分:4)
我正在使用Rails(5.0.0.1)并且可以在我的模型组中使用此语法进行排序,该组通过group_users拥有许多用户:
# Associations.
has_many :group_users
has_many :users, -> { order(:name) }, through: :group_users
根据您的需要调整代码。
答案 6 :(得分:2)
您还可以在分配表上创建一个新的“sort_order”列,并添加一个默认范围,如
default_scope { order('sort_order desc')}
到您的作业模型。
答案 7 :(得分:0)
has_many:users,-> {order(:last_name,:first_name)},:through =>:assignments,来源:'user'