Rails 4.1从counter_sql
关联中删除了has_many
,因此以下内容不再有效:
class Project < ActiveRecord::Base
has_many :backers,
-> { select('COMPLEX SQL QUERY') },
through: :pledges,
source: :backer,
counter_sql: proc { "COMPLEX COUNT SQL QUERY" }
(...)
end
我需要counter_sql
,因为select
中的COMPLEX SQL QUERY,AR project.backers.count
时无法构建有效的SQL。
要解决此问题,我将其移至类似的方法:
class Project < ActiveRecord::Base
has_many :backers,
-> { select('COMPLEX SQL QUERY') },
through: :pledges,
source: :backer
def backers_count
self.class.count_by_sql 'COMPLEX SQL QUERY'
end
(...)
end
这是一个好方法还是有更好的方法?
答案 0 :(得分:1)
您可以使用关联扩展程序
class Project < ActiveRecord::Base
has_many :backers,
-> { select('COMPLEX SQL QUERY') },
through: :pledges,
source: :backer do
def count
#query here
end
end
end
关联代理以proxy_association
的形式提供,特别是proxy_association.owner
返回项目对象。
这会覆盖默认提供的计数方法,因此some_project.backers.count
会调用您的自定义查询