1

フィールドが特定の値と等しくない結果に対してカウントを実行しようとしていますが、常に結果が返されません。

たとえば、CompanyProducts1 対多の関係にあると仮定すると、クエリを実行して ActiveRecord から次の配列を取得できますCompany.find(63).products(これは SQL で に相当しますSELECT "products".* FROM "products" WHERE "products"."company_id" = 63;)。

<Product id: 1, company_id: 63, foo_id: 1>,
<Product id: 2, company_id: 63, foo_id: 3>,
<Product id: 3, company_id: 63, foo_id: nil>, 
<Product id: 4, company_id: 63, foo_id: nil>

ただし、上記のクエリを拡張して、最初のレコード以外のすべてをカウントしようとすると、次のようになります。

Company.find(63).products.where("foo_id != ?", 1).count

SQLでは次のとおりです。

SELECT COUNT(*) FROM "products" WHERE "products"."company_id" = 63 AND (foo_id != 1)

3が表示されると予想すると、結果として常に1が返されるようです。なぜこれが起こっているのですか?どうすれば正しくカウントできますか?

4

3 に答える 3

1

0 ではなく 1 を取得する必要があると言うような場合。探しているのはDISTINCT FROM、as=!=on null 型の両方が結果として不明を返すことです。

SELECT COUNT(*) FROM 
products 
WHERE products.company_id = 63 AND (foo_id IS DISTINCT FROM 1)

http://sqlfiddle.com/#!1/8b7a0/3

そしてさらなる情報として。DISTINCT FROMは PostgreSQL 専用であるため、これを行う標準バージョンは次のようになります。

SELECT COUNT(*) FROM 
products
WHERE products.company_id = 63 AND (foo_id<>1 OR foo_id IS NULL)
于 2013-03-06T21:58:07.907 に答える
0
Company.find(63).products.where("foo_id != ?", 1).count

する必要があります

Company.find(63).products.where("foo_id <> ?", 1).count

しかし、あなたはそれをさらに一歩進める必要があります:

class Product
  def self.not_foo(foo_id)
    where("foo_id <> ?", foo_id)
  end
end

 Company.find(63).products.not_foo(1).count
于 2013-03-06T21:51:20.163 に答える
0

<>代わりに使ってみましたか!=

<>
于 2013-03-06T21:48:37.380 に答える