2013-03-01 5 views
-1

У меня есть модель проекта ж/это ассоциация с описанием членов команды, которые приняли (статус)Как пересечь две ассоциации в isl?

Class Project < ActiveRecord::Base 
    has_many :participants, :through => :team_members, :source => :user, :conditions => ['team_members.status = ?', TeamMember::STATUS[:accept]] 

У меня есть модель деятельности, которая имеет участник также

Class Activity < ActiveRecord::Base 
    belongs_to :project 
    has_many :participants, :through => :collaborations, :source => :user 

деятельности участник, которые могут включать в себя команду членов, которые еще не приняли. Итак, я хочу пересечение этих двух ассоциаций. Моя цель состоит в том, чтобы сделать 1 запрос, а не повторять sql ассоциации и вырвать один столбец. Я нашел Intersect описанный здесь http://www.rubydoc.info/github/rails/arel/Arel/SelectManager#intersect-instance_method и пытался сделать вывод о его использовании с https://github.com/rails/arel/commit/74caeaad157e79853b9c6804f561d3c70eea2346. Но мне не повезло.

Лучшее, что я получил до сих пор является:

a = Activity.find(1) 
team = a.project.participants.select('user_id').to_sql 
peeps = a.participants.where("user_id in (#{team})") 
peeps.pluck('thecolumn') 

Это один запрос (хороший), не повторяет логику ассоциации (хорошего) и не нагружает вверх все AR объектов, поскольку я сразу после одного значения (хорошего). Тем не менее, я надеялся, чтобы быть в состоянии:

a = Activity.find(1) 
peeps = a.project.particpants.intersect a.project.participants 

, который работает, но возвращает AREL :: Вершины :: Intersect ... не знаю, как захватить результаты этого.

+0

Любой удачи с этим? –

+0

нет, все еще используя .to_sql:/ –

+1

См. Мой вопрос и как я заработал это сейчас: http://stackoverflow.com/questions/24320469/how-to-write-activerecord-arel-intersection-query/24323622 # 24323622 –

ответ

0

Поскольку Арел поддерживает to_sql вы можете сделать:

a = Activity.find(1) 
peeps = a.project.particpants.intersect a.project.participants #(sic) 
Participant.find_by_sql(["SELECT participants.* FROM #{peeps.to_sql}", ...]) 

Но вместо того, пересекающиеся с собой, я думаю, что вы имели в виду:

a = Activity.find(1) 
peeps = a.particpants.intersect a.project.participants 
Participant.find_by_sql(["SELECT * FROM #{peeps.to_sql}", ...]) 

Вам необходимо предоставить параметры запроса ,

Я также имел успех, делая такие вещи, как это, чтобы получить соотношение

PublicActivity::Activity.from("(#{activities.to_sql} UNION #{task_activities.to_sql}) as activities").order("created_at DESC") 
Смежные вопросы