рельсы: как построить область активных отношений для обхода многих таблиц? - PullRequest
1 голос
/ 05 июня 2010

У меня есть эти таблицы и отношения:

user has_many projects
project has_many tasks
task has_many actions

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

Спасибо

Ответы [ 2 ]

0 голосов
/ 26 июня 2010

Я нашел то, что работает.

В модели Actions:

def self.owned_by (user)
    joins("join tasks on actions.task_id = tasks.id").
    joins("join projects on tasks.list_id = projects.id").
    where("projects.user_id = ?" , user.id)
end

С консоли:

u=User.find(1)
Action.owned_by(u).count

 => 521 # which is correct

Я не уверен, что этолучший способ сделать это, так как я немного новичок в sql.Я чувствую, что это можно сделать более кратким.

РЕДАКТИРОВАТЬ Чуть лучше

 Action.joins(:task => [{:project => :user }]).where(:projects => {:user_id =>  user.id })
0 голосов
/ 13 июня 2010

Не думаю, что для этого нужны области, если вы используете плагин nested_has_many_through .

class User < ActiveRecord::Base

  has_many :projects
  has_many :tasks, :through => :projects
  has_many :actions, :through => :tasks

end

class Project < ActiveRecord::Base

  has_many :tasks
  has_many :actions, :through => :tasks

end

User.first.actions
...