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'
'IT TIP' 카테고리의 다른 글
| Maven 체크 스타일 비활성화 (0) | 2020.12.10 |
|---|---|
| C # UserControl에 Dispose 기능을 어떻게 추가합니까? (0) | 2020.12.10 |
| 기본 생성자없이 객체 배열 초기화 (0) | 2020.12.10 |
| JSF 2.0에서 세션을 무효화하는 방법은 무엇입니까? (0) | 2020.12.10 |
| 서버 측 브라우저 감지? (0) | 2020.12.10 |