IT TIP

Ruby on Rails에서 연결을 통해 has_many를 어떻게 주문합니까?

itqueen 2020. 12. 10. 21:34
반응형

Ruby on Rails에서 연결을 통해 has_many를 어떻게 주문합니까?


다음 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작업이 주어 졌을 때 어떻게 사용자를 정렬 할 수 있습니까?


조건 인수는 Rails 4에서 더 이상 사용되지 않으므로 범위 블록을 사용해야합니다.

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

Rails 3.x 버전 :

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

업데이트 : 이것은 Rails 3.x에서만 작동합니다 (아마도 그 이전에). 4+의 경우 다른 답변을 참조하십시오.


M.G.Palmer's접근 방식은 그러나 테이블 이름이 관여, 잘 작동합니다. 더 나은 방법이 있습니다.

has_many :users, :through => :assignments, :order => [ :last_name, :first_name ]

이것이 당신에게 효과가 있습니까?

# 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


이것은 나를 위해 작동합니다 (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

Rails (5.0.0.1)를 사용하고 있으며 group_users를 통해 많은 사용자가있는 모델 그룹에서이 구문으로 정렬 할 수 있습니다.

# Associations.
has_many :group_users
has_many :users, -> { order(:name) }, through: :group_users

작동 할 필요에 따라 코드를 조정하십시오.


할당 테이블에 새 'sort_order'열을 만들고 다음과 같은 기본 범위를 추가 할 수도 있습니다.

default_scope { order('sort_order desc')}

할당 모델에.


has_many : users,-> {order (: last_name, : first_name)}, : through => : 할당, 소스 : 'user'

참고URL : https://stackoverflow.com/questions/2205618/how-do-i-order-a-has-many-through-association-in-ruby-on-rails

반응형