2012-02-27 2 views
12

После прочтения: thisActiveRecord - как получить все колонки соединяемых таблиц

Я до сих пор не понимаю. в консоли:

puts Category.joins(:posts) 

Выполняет соединение или левое соединение по категории и положению.

Однако все возвращенные данные представляют собой только столбцы в таблице категорий. Как получить данные столбцов в столбце. ?

Должен ли я сделать еще одну модель для достижения этой цели?

после прочтения: this Is find_by_SQL - единственный способ? Я хочу, если возможно, ActiveRecord.

Спасибо.

+0

Вы должны уточнить, чего вы пытаетесь достичь. Если вы хотите, чтобы это «способ активной записи», вы даже не должны говорить о «столбцах», потому что вы управляете объектами, а не таблицами. Если вам действительно нужны необработанные данные, вы можете использовать 'ActiveRecord :: Base.connection.select_all ('SELECT ...')', это вернет вам массив хэшей (без инициализации модели). [документация здесь] (http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html#method-i-select_all) –

+0

спасибо, я использую этот путь сейчас: ActiveRecord :: Base.connection .select_all (Category.joins (: posts) .to_sql)), так ли это слишком противно? –

+0

Нет проблем. Однако, если вы действительно хотите работать с ORM, вы должны использовать только эти трюки для действительно сложных SQL-запросов. Для такой тривиальной проблемы я бы использовал решение @ abhishek + 'includes'. Зачем использовать ORM, если вы не используете код OO? –

ответ

4

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

Category.joins(:posts).collect{|category| category.posts.map{|post| post.attributes.merge(category.attributes) } } 

Это даст вам гигантский список пост и атрибуты категории, объединенные для каждой категории.

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

Post.joins(:category, :comments) 

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

+3

остерегайтесь, 'collect', скорее всего, приведет к проблеме с запросом N + 1 , Чтобы этого избежать, используйте 'includes'. см. [Руководства RoR по активной загрузке] (http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations) –

+0

@m_x, конечно, этот код предназначен для демонстрации. – abhishek

+0

thanks @m_x и abhishek –

6

Вы можете попробовать метод выбора():

Category.select("categories.*, posts.*").joins(:posts) 
+1

Спасибо за ответ. Это не сработает. Он по-прежнему возвращает только «категории. *». С тех пор, как сгенерированный SQL является «SELECT category. *, Posts. * From ... –

+0

Как вы проверяете, работает ли он? Я только что протестировал его, отлично работает для меня. – Ineu

+0

Я запускаю эту команду в« rails console » Использование puts и ap (удивительная печать): puts Category.select ("categories. *, Posts. *"). Joins (: posts) Он просто возвращает объект # <Категория: 0x0000000528c170>. И только столбец категории внутри. –

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