Cela fonctionne:
class Fact < ActiveRecord::Base
scope :by_user, lambda { |id| joins(:user).where('users.id == ?', id).readonly(false) }
scope :vote_count, lambda { |count| where('? == (select count(fact_id) from votes where votes.fact_id == facts.id)', count)}
end
Fact.by_user(1).vote_count(0)
Le champ d'vote_count est un peu sqly mais vous pouvez enchaîner ces viseurs comme bon vous semble, vous pouvez également voir le sql sous-jacente avec:
Fact.by_user(1).vote_count(0).to_sql
Et plus à votre commentaire, vous pourriez faire la même chose en pure Arel en déclarant d'abord les Relations:
f = Arel::Table.new(:facts)
v = Arel::Table.new(:votes)
u = Arel::Table.new(:users)
Ensuite, composer la requête et la rendre en sql.
sql = f.join(u).on(f[:user_id].eq(1)).where('0 == (select count(fact_id) from votes where votes.fact_id == facts.id)').to_sql
Vous pouvez agir sur des colonnes avec des opérateurs:f[:user_id].eq(1)
ensuite l'utiliser:
Fact.find_by_sql(sql)
Je suis sûr que theres beaucoup plus que vous pouvez faire pour obtenir un plus élégant syntaxe (sans le 'où 0 == ...'). Aussi je suis assez sûr portées Rails3 utilisent Arel dans les coulisses - http://m.onkey.org/active-record-query-interface
ce qui est Arel? Peux-tu poster un lien? – s84
@Sam: http://stackoverflow.com/questions/2770415/what-exactly-is-arel-in-rails-3-0 – Zabba