Как я заказываю внешним атрибутом для belongs_to ссылки, где существует 2 ключа к внешней таблице

У меня есть Модель, которая имеет a 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') 

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

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

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

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

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

5
задан Will 14 April 2010 в 16:58
поделиться

2 ответа

Это называется псевдонимом таблиц в 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 . Найдите Таблица псевдонимов , чтобы перейти к определенному разделу.

2
ответ дан 14 December 2019 в 08:46
поделиться

Обновление - это добавлено в оригинальный вопрос.

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

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

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

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

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

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

5
ответ дан 14 December 2019 в 08:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: