Это работает:
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)
Область vote_count немного sqly, но вы можете цепи эти искатели, как вам нравится, вы также можете увидеть основную SQL с:
Fact.by_user(1).vote_count(0).to_sql
и в дальнейшем ваш комментарий, вы можете сделать то же самое в чистом Ареле, сначала объявив Отношения:
f = Arel::Table.new(:facts)
v = Arel::Table.new(:votes)
u = Arel::Table.new(:users)
Затем составление запроса и его преобразование в 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
Вы можете действовать на колонках с операторами:f[:user_id].eq(1)
Затем, используя его:
Fact.find_by_sql(sql)
Я уверен, Theres намного больше, что вы могли бы сделать, чтобы получить более элегантный синтаксис (без «где 0 == ...»). Кроме того, я уверен, что Rails3 прицелы использовать Arel за кулисами - http://m.onkey.org/active-record-query-interface
что Арел? можете ли вы опубликовать ссылку? – s84
@Sam: http://stackoverflow.com/questions/2770415/what-exactly-is-arel-in-rails-3-0 – Zabba