2016-09-30 4 views
1

Когда я to_sql на следующем запросе он отлично работает:to_sql не работает, когда срывать участвует

2.1.8 :017 > Task.joins(:recurrence).group('recurrences.id').to_sql 
=> "SELECT `tasks`.* FROM `tasks` INNER JOIN `recurrences` ON `recurrences`.`id` = `tasks`.`recurrence_id` GROUP BY recurrences.id" 

Но тогда, когда я добавляю pluck он не работает:

2.1.8 :018 > Task.joins(:recurrence).group('recurrences.id').pluck('tasks.title').to_sql 
    (21.0ms) SELECT tasks.title FROM `tasks` INNER JOIN `recurrences` ON `recurrences`.`id` = `tasks`.`recurrence_id` GROUP BY recurrences.id 
NoMethodError: undefined method `to_sql' for #<Array:0x007fbde9863f18> 

По-видимому, добавление pluck изменяет тип объекта с ActiveRecord_Relation на Array, и вы, очевидно, не можете выполнить to_sql на массиве.

Что я хотел его выход (для начинающих) заключается в следующем:

SELECT tasks.title FROM `tasks` INNER JOIN `recurrences` ON `recurrences`.`id` = `tasks`.`recurrence_id` GROUP BY recurrences.id 

... что на самом деле то, что я копировать/вставить из запроса, генерируемого Task.joins(:recurrence).group('recurrences.id').pluck('tasks.title') без to_sql.

Можно ли делать то, что я хочу делать?

ответ

2

Я понял. Я должен использовать select.

> Task.select('tasks.title').joins(:recurrence).group('recurrences.id').to_sql 
=> "SELECT tasks.title FROM `tasks` INNER JOIN `recurrences` ON `recurrences`.`id` = `tasks`.`recurrence_id` GROUP BY recurrences.id" 
+1

Стоит упомянуть, что это потому, что 'pluck' является нетерпеливым методом (как' find'), он немедленно переходит к базе данных и возвращает массив результатов. Документы [здесь] (http://guides.rubyonrails.org/active_record_querying.html#pluck) и [здесь] (http://edgeapi.rubyonrails.org/classes/Enumerable.html#method-i-pluck) –

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