Więc tak, mam 2 modele: User i Contract. User używa closure_tree (api podobne do acts_as_tree itp) więc ma #self_and_descendants które zwraca jego, jego dzieci, wnuki itd. Chciałbym móc zrobić User#contracts, które zwróci mi jego kontrakty oraz kontrakty jego dzieci, wnuków itd.
Narazie udało mi się zrobić coś takiego:
[code=ruby]class User < ActiveRecord::Base
acts_as_tree
has_many :contracts, finder_sql: proc {
Contract.where(user_id: self_and_descendants.select(:id))
}
end
class Contract < ActiveRecord::Base
belongs_to :user
end[/code]
to działa prawie dobrze, bo User#contracts zwraca to co powinno. Problem pojawia się gdy chcę np. User#contracts.where(foo: :bar), bo wtedy generowany jest normalny (SELECT * FROM contracts WHERE user_id = id) sql a nie ten zdefiniowany w finder_sql.