1

私は最初の結合を試みていますが、それが生成するSQLは非常に奇妙です。

受信者がユーザーに属しています。読み取られておらず、削除されていないユーザーによるすべての受信者にクエリを実行しようとしています。

scope :unread, where(:is_read => false).where(:is_deleted => false)
scope :unread_by_user_id, lambda { |id| unread.joins(:user).merge(User.by_id(id)) }

これはそれが生成するSQLです:

SELECT `recipients`.* FROM `recipients` INNER JOIN `users` ON `users`.`id` IS NULL WHERE `recipients`.`is_read` = 0 AND `recipients`.`is_deleted` = 0 AND `users`.`id` = 475

「ISNULL」を取り除く方法はありますか?それはそこにあるはずではありません:(

私はグーグルを検索してみました、そして実際にそこにある例の95%が結合について話していないのは本当に驚くべきことです。私が見つけた結合のいくつかの例では、減価償却された&構文を使用しています。このためのドキュメントは、実際には他のものと比較してかなり悪いです。確かに非常に奇妙です。

とにかく、私はこれを機能させることができません。ソフトウェアを19年間開発していて、単一のテーブルにSQLを結合できない場合は、間違いなく良い日ではありません:( 15個の結合でSQLでクエリを手動で記述できます。これは、あなたが支払う代償だと思います。新しいフレームワークを調べて学習するときもありますが、Hibernateではそれほど奇妙なことではありません:/

4

1 に答える 1

2

ユーザーがすでにフェッチされていると仮定します。

user.recipients.unread

受信者の関連付けにより、受信者はすでにそのユーザーに制限されています。そのための別のスコープを持つことは私には意味がありません。

- 編集

これは、ユーザーモデルにhas_many :recipients関連付けが定義されている場合に機能します。

于 2011-05-03T04:21:47.887 に答える