У меня есть Модель, которая имеет 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 и хотите отправить поле порядка на контроллер. Таким образом, можно хотеть к первому порядку на авторе затем редактора. Но это перестало бы работать для для одного из запросов (если Вы динамично не изменяете включение также),
Это называется псевдонимом таблиц в 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 . Найдите Таблица псевдонимов
, чтобы перейти к определенному разделу.
Так что я думаю, что у меня получилось. Это было не совсем очевидно, но, глядя на мои журналы, я понял это.
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)