2016-03-06 3 views
0

У меня есть следующие модели:Rails activerecords с вложенным включает

class BusinessProcess < ActiveRecord::Base 
    has_many :todos 
end 

class Todo < ActiveRecord::Base 
    has_one :row 
end 

class Row < ActiveRecord::Base 
    has_many :users 
end 

Как я могу подсчитать количество rows в BusinessProcess, который имеет строки на определенной user?

Что-то вроде:

@businessProcess.todos.includes(XXX).where(users.id=?,1).count

+0

Не могли бы вы добавить код классов ActiveRecord? По крайней мере, ассоциации. Кстати * @ businessProcess * не очень Rubyish. –

+0

Я искал вашу проблему. Можете ли вы прояснить одно? В 'Row' вы имеете' has_many: users'. Это подразумевает, я думаю, что 'Пользователь' должен иметь' принадлежит_то: строка'. Кажется, что, как «Пользователь», может быть только один «Ряд». Это верно? Кажется странным, так как «Пользователь», по-видимому, имел бы много строк, и в этом случае вам понадобится модель соединения «многие-ко-многим». Благодарю. – jvillian

ответ

0

@ businessProcess.todos.includes (: строка =>: пользователи) .где ("? Users.id =", 1) .Count

+0

Если вы просто хотите подсчитать количество строк в BusinessProcess, это не подходящее решение, так как вы создаете экземпляр всех объектов Todo, объектов Row и объектов User. Это медленно. –

+0

Строки в этом случае - это модель, а не нормальная строка. Я хочу, чтобы подсчет строк принадлежал BusinessProcess через todo. Я не вижу другого пути. Вы? – user3618353

0

По ваших ассоциаций, я предпочел бы пойти с только соединения таблиц, как:

class Todo < ActiveRecord::Base 
    has_one :row 
    has_many: users, through: :row 

    scope :by_user_id, ->(user_id) { 
    joins(:users).where("users.id = ?", user_id) 
    } 
end 

, а затем:

@business_process.todos.by_user_id(1).count 

Может быть, вы могли бы думать о перемещении условия где в сферу Row, но это больше ответственности штучка. Вы также можете прочитать о ARel в качестве альтернативы: The N+1 problem and ARel.

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