Как заказать по внешнему атрибуту ссылку на принадлежность, где есть 2 ключа к внешней таблице - PullRequest
5 голосов
/ 12 апреля 2010

У меня есть модель, которая имеет belongs_to связь с другой моделью следующим образом

class Article
  belongs_to :author, :class_name => "User"
end

Если бы я хотел найти все статьи для определенного жанра, заказанные автором, я сделал бы что-то вроде следующего

articles = Article.all(:includes => [:author], :order => "users.name")

Однако, если Article имеет две ссылки на User, как я могу отсортировать по :author?

class Article
  belongs_to :editor, :class_name => "User"
  belongs_to :author, :class_name => "User"
end

Я пытался

articles = Article.all(:includes => [:author], :order => "users.name") 
#=> incorrect results
articles = Article.all(:includes => [:author], :order => "authors.name") 
#=> Exception Thrown

Моя первая попытка решения

Половина решения выглядит следующим образом. Это было не совсем очевидно, но, глядя на мои журналы, я понял это.

class Article
  belongs_to :editor, :class_name => "User"
  belongs_to :author, :class_name => "User"
end

В основном вам нужно сделать следующее

articles = Article.all(:include => [:editor,:author], :order => 'articles_authors.name')

articles = Article.all(:include => [:editor,:author], :order => 'authors_articles.name') 

Это имя псевдонима, которое я пропустил (article_authors)

Проблема в том, что следующее не работает, хотя кажется, что должно.

articles = Article.all(:include => [:editor,:author], :order => 'authors_articles.name')

articles = Article.all(:include => [:editor,:author], :order => 'editors_articles.name')

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

Ответы [ 2 ]

5 голосов
/ 12 апреля 2010

Обновление - добавлено в исходный вопрос.

Так что я думаю, что прибил это. Это было не совсем очевидно, но, глядя на мои журналы, я понял это.

class Article
  belongs_to :editor, :class_name => "User"
  belongs_to :author, :class_name => "User"
end

В основном вам нужно сделать следующее

articles = Article.all(:include => [:editor,:author], :order => 'articles_authors.name')

articles = Article.all(:include => [:editor,:author], :order => 'authors_articles.name') 

Это имя псевдонима, которое я пропустил (Articles_authors)

2 голосов
/ 13 апреля 2010

Это называется Table Aliasing в ActiveRecord. Когда метод find присоединяется к одной и той же таблице более одного раза, псевдонимы для таблицы определяются следующим образом:

Active Record uses table aliasing in the case that a table is referenced 
multiple times in a join. If a table is referenced only once, the standard table 
name is used. The second time, the table is aliased as 
#{reflection_name}_#{parent_table_name}. Indexes are appended for any more 
successive uses of the table name. 

См. Документацию ActiveRecord для получения более подробной информации. Найдите Table Aliasing, чтобы перейти к определенному разделу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...