2017-01-25 14 views
1

私は私の知る限りではRails 3 ActiveRecord#にはバグが含まれていますか?

class Account < ActiveRecord::Base 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    attr_accessible :email 
    has_many :accounts 
end 

は、電子メールを持つすべてのユーザーのためのパターンに一致するすべてのアカウントを選択するために、私たちがしなければならない、次のモデルが参加

Account.joins(:user).where("users.email ILIKE ?", '%pattern%') -> work 

そして、ここに魔法が来て、交換には参加して、まだ魅力

Account.includes(:user).where("users.email ILIKE ?", '%pattern%') -> work 

しかし

のような働きを含み
Account.includes(:user).where("users.email ILIKE ?", '%pattern%').count -> error 

説明はありますか? Eager Loadingのみのためのものではありませんか?

+0

はあなたが取得しているエラーを投稿することができ、実際のテーブル名を必要としながら、ということ

Account.includes(:user).references(:users).where("users.email ILIKE ?", '%pattern%').count 

または

Account.eager_load(:user).where("users.email ILIKE ?", '%pattern%').count 

注意? – jithya

+0

試してみてください。 '、'%pattern% ')。length' – Sravan

+0

テーブルを使用している場合は、実際には左外部結合が含まれます。結果 –

答えて

1

明示的な参照なしでincludesが別のクエリで関係を読み込むためです。レールのコンソールを見てみましょう:

[11] pry(main)> Account.includes(:user) 
    AccountsUser Load (4.6ms) SELECT "accounts".* FROM "accounts" 
    User Load (11.7ms) SELECT "users".* FROM "users" WHERE "users"."id" IN (... 

[11] pry(main)> Account.includes(:user).where("users.email ILIKE ?", '%pattern%').to_sql 
    SELECT "accounts".* FROM "accounts" WHERE (users.email ILIKE '%admin%') 

あなたがエラーを取得している理由であること - usersテーブルがクエリで参照されていません。ユーザーテーブルの使用を参照するにはいずれかreferencesまたはeager_load:関連名のincludes作品はreferences

+0

しかし問題は' Account.includes(:user).where( "users.email ILIKE?"、 '%pattern% ')' count% ')'はまだ正常に動作しています。 – nqtien310

関連する問題