2

course.rb

  has_many :current_users, :through => :user_statuses, :source => :user, :conditions => ['user_statuses.updated_at > ?', 1.hour.ago]

コンソール

Loading development environment (Rails 3.2.2)
>> course = Course.find(1)
  Course Load (0.3ms)  SELECT `courses`.* FROM `courses` WHERE `courses`.`id` = 1 LIMIT 1
=> #<Course id: 1, title: "Course 1", created_at: "2012-04-17 19:17:15", updated_at: "2012-04-17 19:17:15">
>> Time.now
=> 2012-04-23 08:29:45 -0400
>> course.current_users.count
   (0.4ms)  SELECT COUNT(*) FROM `users` INNER JOIN `user_statuses` ON `users`.`id` = `user_statuses`.`user_id` WHERE `user_statuses`.`user_id` = 1 AND (user_statuses.updated_at > '2012-04-23 12:28:40')
=> 0
>> Time.now
=> 2012-04-23 08:30:07 -0400
>> course.current_users.count
   (0.4ms)  SELECT COUNT(*) FROM `users` INNER JOIN `user_statuses` ON `users`.`id` = `user_statuses`.`user_id` WHERE `user_statuses`.`user_id` = 1 AND (user_statuses.updated_at > '2012-04-23 12:28:40')
=> 0
>>

条件を確認する1.hour.agoと、リクエストした時刻との差が 30 秒あるにもかかわらず、開始点として同じ時刻を使用していることに注意してください。コンソールを終了して再起動するとクリアされますが、新しい時間で再び発生します。この動作は、テストとブラウザーにも存在します。検索に時間ベースの条件を使用するモデルを取得するにはどうすればよいhas_many :throughですか?

4

2 に答える 2

2

モデルの関係で動的条件を使用したいと思います。

このSOの質問を見てください

基本的に、モデルが読み込まれると、1.hour.ago一度だけ評価されます。あなたの質問が理解できたら、リクエストごとに評価してほしいと思います。

このようなもの(レール3.1+):

:conditions => lambda { |course| "user_statuses.updated_at > '#{1.hour.ago}'" }
于 2012-04-23T12:46:28.660 に答える
0

has_many :through セットアップまたはメソッドのいずれかで、モデルにクエリを配置してもまったく機能しませんでした。そのため、関連付けを削除して、コントローラーにクエリを配置することになりました。これにより、リクエストが行われたときに現在の時刻を計算できます。

モデル:

has_many :user_statuses

コントローラ:

@course = Course.find(params[:id])
@current_users = @course.user_statuses.where('updated_at > ?', 1.hour.ago)
于 2012-05-08T16:31:50.180 に答える