2010-02-05 4 views
51

Учитывая следующие модели AR, я хотел бы, чтобы сортировать пользователей в алфавитном порядке по фамилиям, когда данный дескриптор задачи:Как заказать has_many через объединение в Ruby on Rails?

Я хотел бы получить задачу затем навигацию к ее присвоенных пользователям, и сортировать список пользователей в алфавитном порядке.

Я продолжаю думать, что я должен быть в состоянии добавить статью :order в has_many :users, :through => :assignments так:

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

однако это не работает.

Как я могу сортировать пользователей по last_name при задании задания?

ответ

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

+2

Простите старый вопрос, но это может иметь отношение к будущим читателям: некоторые плагины (например, act_as_list) работают неправильно с default_scope. – robinjam

+0

Также напугало это, поскольку у меня была аналогичная проблема, но мне нужно было сортировать по полю IN: через таблицу. Удивительно, что default_scope также работает в: через таблицу, а записи, полученные с помощью этой зависимости, будут уважать порядок. – MBHNYC

36

Rails версии 3.x:

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

UPDATE: Это работает только в Rails 3.x (возможно, до этого тоже). Для 4+ см. Другие ответы.

+0

Хорошо работает для меня. Чистое решение, которое не влияет на другие функции отсортированной модели, как это делает первый ответ. – barancw

+2

не работает, он говорит: заказ не является ключом. Ниже приведен ответ об отказе от работы. – RohitPorwal

12

Подход M.G.Palmer's работает хорошо, однако используется название таблицы. Существует лучший способ сделать это:

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

, но что, если порядок определяется таблицей соединений? например назначений ... , но без определения области по умолчанию для назначений .. – Tilo

2

Вы также можете создать новый столбец «SORT_ORDER» на таблице назначения, а также добавлять рамки по умолчанию, как

default_scope { order('sort_order desc')} 

к вашей модели заданий.

65

Поскольку аргументы состояния осуждается в Rails 4, следует использовать область применения блоков:

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

Похоже, что в Rails 4 есть ошибка в этом https://github.com/rails/rails/issues/17904 «В Rails 4.0, order был проигнорирован. В Rails 4.1 генерируется недопустимый SQL. " – Nate

+0

Это даже не дает мне этого, просто полностью игнорирует предложение заказа без сообщения. –

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 
2

Я использую Rails (5.0.0.1) и могли бы сделать то с этим синтаксисом в моей модели Группы, имеет много пользователей через group_users:

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

Откорректируйте код в соответствии с вашими потребностями, которые будут работать.

Смежные вопросы