62

次の 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タスクが与えられたときにユーザーを並べ替えるにはどうすればよいですか?

4

8 に答える 8

37

Rails 3.x バージョン:

has_many :users, :through => :assignments, :order => 'users.last_name, users.first_name'

更新: これは Rails 3.x でのみ機能します (おそらくそれ以前も)。4+については、他の回答を参照してください。

于 2011-10-18T11:19:57.753 に答える
12

このM.G.Palmer'sアプローチはうまく機能しますが、テーブル名が関係します。それを行うためのより良い方法があります:

has_many :users, :through => :assignments, :order => [ :last_name, :first_name ]
于 2012-09-24T05:17:52.810 に答える
7

これは私にとってはうまくいきます(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
于 2015-07-31T15:55:45.700 に答える
2

割り当てテーブルに新しい「sort_order」列を作成し、次のようなデフォルトのスコープを追加することもできます

default_scope { order('sort_order desc')}

割り当てモデルに。

于 2013-01-16T06:27:46.317 に答える