2

课程.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 question

基本上,当您的模型加载时,1.hour.ago只评估一次。如果我理解您的问题,您希望对每个请求进行评估。

像这样的东西(rails 3.1+):

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

将查询放入模型中根本不起作用,无论是在 has_many :通过设置还是在方法中。所以我最终删除了关联并将查询放入控制器中。这允许在发出请求时计算当前时间。

模型:

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 回答