0
rails --version
2.3.16
ruby --version
1.8.7

モデル:

class AToB
    belongs_to :a
    belongs_to :b
    default_scope :include => [:a, :b]
end
class A
    has_many :a_to_bs
    has_many :bs, :through => :a_to_bs
    named_scope :twos, :conditions => { :var => 2 }
    named_scope :buzzed, :conditions => { :fizz => ['buzz'] }
end
class B
    has_many :a_to_bs
    has_many :as, :through => :a_to_bs
end

MYSQL クエリ:

SELECT COUNT(DISTINCT a.id), COUNT(DISTINCT c.id)
FROM a_to_b
INNER JOIN a on a.id = a_to_b.a_id
INNER JOIN b on b.id = a_to_b.b_id
WHERE (a.var = 2 AND a.fizz in ('buzz') AND
       (b.foo = TRUE OR b.bar = TRUE OR (b.moo = TRUE AND a_to_b.goo = FALSE))
      )

このバリエーションも必要になります

SELECT COUNT(DISTINCT a.id), COUNT(DISTINCT c.id)
FROM a_to_b
INNER JOIN a on a.id = a_to_b.a_id
INNER JOIN b on b.id = a_to_b.b_id
WHERE (a.var = 2 AND a.fizz in ('buzz') AND
       NOT (b.foo = TRUE OR b.bar = TRUE OR (b.moo = TRUE AND a_to_b.goo = FALSE))
      )

私はすでに数え切れないほどの単純な例をグーグルで調べたり、レールのドキュメントを読んだりしましたが、役に立ちませんでした。

4

2 に答える 2

0

この質問に答えてみましょう。たとえば、Railsのモデルは次のとおりです。

#a.rb
class A < ActiveRecord::Base 
  attr_accessible :var, :fizz
  has_many :a_to_bs
end

#b.rb
class B < ActiveRecord::Base
  attr_accessible :foo, :bar, :moo
  has_many :a_to_bs
end

#a_to_b.rb
class AToB < ActiveRecord::Base
  attr_accessible :goo, :a_id, :b_id, :a, :b
  belongs_to :a
  belongs_to :b
end

最初のクエリの一般的なクエリは次のとおりです。

records = AToB.where("a.var = ? AND a.fizz in (?) AND (b.foo = ? OR b.bar = ? OR 
          (b.moo = ? AND a_to_b.goo = ?))", 2, 'buzz', true, true, true, false)

そして2番目のものは次のようになります:

records = AToB.where("a.var = ? AND a.fizz in (?) AND NOT (b.foo = ? OR b.bar = ? OR
         (b.moo = ? AND a_to_b.goo = ?))", 2, 'buzz', true, true, true, false)

あなたが言及した質問が正しいと仮定すると、答えは真実です。

于 2013-02-26T07:29:36.600 に答える
0

これはちょっとうまくいきました:

scope = A.twos.buzzed
scope.count(:joins => { :b => :a_to_b }, :conditions => "b.foo = TRUE OR b.bar = TRUE OR (b.moo = TRUE AND a_to_b.goo = FALSE)")

私が確信する前に、もう少しテストするつもりです。

于 2013-02-26T11:40:11.557 に答える