2013-04-15 2 views
0

Отредактировал свой вопрос, чтобы уточнить, о чем я прошу ..Rails - Есть ли лучшие альтернативы для сбора?

У меня есть вложенные ассоциации в мои данные, которые я загружаю, а затем хочу использовать коллекцию для выполнения некоторой дополнительной обработки. Так сказать, у меня есть сообщения с комментариями, которые имеют атрибут владельца. Поэтому я делаю

Post.includes(:comments).collect(&:owner) 

..и затем сделайте что-нибудь с владельцами. Есть ли лучший способ захватить владельцев?

+1

'all' возвращает все записи, а затем вы фильтрации с помощью' collect' - попробуйте использовать ActiveRecord 'where' - т.е.' Model.where (: some_attr => правда) ' – house9

+0

@ house9 спасибо Я редактировал мой вопрос соответственно – absolutskyy

ответ

1

Попробуйте Activerecord::Base#select:

Model.today.select([:attr1, :attr2, :attr3]) # chainable method 
# will generate this query 
# SELECT attr1, attr2, attr3 FROM models 
+0

Обратите внимание, что это вернет экземпляры 'MyModel', которые имеют только атрибуты adn для выбранных столбцов. Если 'MyModel' имеет' id', 'name' и' date', и вы делаете 'MyModel.select (: name)' все возвращаемые вами экземпляры будут выглядеть как '# и т. Д. '. И если вы попытаетесь получить доступ к другому атрибуту на нем, он вернется как нуль. – MrDanA

+1

Я должен добавить, что это означает, что ваш запрос БД выполняется быстрее, поскольку он выбирает меньше, но если вам нужен массив Ruby со всеми именами (например), вам все равно придется использовать 'collect' для их захвата. – MrDanA

+0

На самом деле, я думал, что это была цель вопроса. Получение всех столбцов из толстой таблицы, когда вам нужны только имена, не так быстро, как только может. – nicooga

2

Вы ищете pluck?

Client.where(:active => true).pluck(:id) 
# SELECT id FROM clients WHERE active = 1 

Client.uniq.pluck(:role) 
# SELECT DISTINCT role FROM clients 
+0

Обратите внимание, что pluck недоступен для всех версий Rails. – MrDanA

0

Rails будет работать, что вы хотите, если вы добавляете has_many_through ассоциацию.

class Post < ActiveRecord::Base 
    has_many :comments 
    has_many :commenters, through: :comments, source: :owner 
    ... 
end 

male_gardeners = Post.find_by(slug: 'in_the_garden').commenters.where(gender: 'M') 
Смежные вопросы