0

この問題はかなり単純に思えますが、このような問題に遭遇したことはありません。

設定は次のとおりです。

Post has_many :reader_links
Post has_many :readers, :through => :reader_links

投稿を読んでいる読者がいるかどうかを調べる必要があります。

@post.reader_links.where('created_at >= ?', 45.minutes.ago).any?

よく働く。

@post.readers.where('created_at >= ?', 45.minutes.ago),any?

列がリーダーオブジェクトの列を意味するのか、 reader_linkオブジェクトの列を意味するのかが混乱するため、あいまいなテーブル列エラーがスローされます。これは、リーダーのクラスが実際にはUser であるためです。45 分前に reader_links によって作成された読者を照会するにはどうすればよいですか?created_at

私は次のようなものを探しています..

@post.readers.where('reader_link.created_at >= ?', 45.minutes.ago)

4

2 に答える 2

1

スコープをマージしてあいまいなエラーを取り除くことができるため、各スコープには独自の可視範囲があります。

使用meta_where:

Post.scoped & (ReaderLink.scoped & User.where(:created_at.gt => 45.minutes.ago))

なしmeta_where:

Post.scoped.merge(ReaderLink.scoped.merge(User.where('created_at >= ?', 45.minutes.ago))

これにより、Post45 分未満のすべてのリーダーの reader_links およびリーダー データを含むオブジェクトの配列が生成されます。Railsコンソールで試してみてください。

編集:単一の投稿用

post_with_fresh_users = Post.where('id = ?', some_id).merge(ReaderLink.scoped.merge(User.where('created_at >= ?', 45.minutes.ago))

編集:投稿のすべての新鮮な読者(異なる順序)

fresh_readers_for_post = User.where('created_at >= ?', 45.minutes.ago).merge(ReaderLink.scoped.merge(Post.where('id = ?', @post.id))

使い方:

http://benhoskin.gs/2012/07/04/arel-merge-a-hidden-gem

于 2013-04-06T03:24:14.157 に答える
1

私が正しければ、created_at話している列を指定するだけです。

@post.readers.where('reader_links.created_at >= ?', 45.minutes.ago).any?
于 2013-04-06T13:51:11.377 に答える