ActiveRecord:获取今天应该被禁止的所有用户

时间:2017-08-02 10:31:24

标签: ruby-on-rails activerecord

我有两种模式:

class User < ActiveRecord::Base
  has_many :ban_messages, dependent: :destroy
end

class BanMessage < ActiveRecord::Base
  belongs_to :user
end

BanMessage包含一个字段t.datetime :ban_date,用于存储禁止用户的日期。 User表包含一个字段status,其中包含一个状态值(活动,暂停,禁止)。当我向用户发送BanMessage时,他的状态字段从“活动”变为“暂停”。我也可以激活用户,所以他不会被':ban_date'禁止,但他的BanMessage不会被销毁。 因此,我需要创建查询以选择状态为“已暂停”的所有用户,这些用户在其最新的BanMessages记录“ban_date”字段中具有DateTime值,该值介于'DateTime.now.beginning_of_day''DateTime.now.end_of_day'之间。

3 个答案:

答案 0 :(得分:1)

您可以使用where查询后跟join方法对相关ban_messages where方法User.where(status: 'suspended').joins(:ban_messages).where("ban_date >= ? AND ban_date <= ?", DateTime.now.beginning_of_day, DateTime.now.end_of_day ) 方法进行过滤,以进一步过滤日期范围。

.clientHeight

答案 1 :(得分:0)

尝试这样的事情。

User.joins(:ban_messages).where(status: :suspended).where('ban_messages.ban_date BETWEEN :begin_time AND :end_date', begin_time: DateTime.now.beginning_of_day, end_time: DateTime.now.end_of_day)

答案 2 :(得分:0)

这就是我需要的:

User.joins(:ban_messages)
  .where('users.status = ?', :suspended)
  .where('ban_messages.created_at = (SELECT MAX(ban_messages.created_at) FROM ban_messages WHERE ban_messages.user_id = users.id)')
  .where('ban_messages.ban_date BETWEEN ? and ?',  DateTime.now.beginning_of_day, DateTime.now.end_of_day)
  .group('users.id')

<强>更新

  

MrYoshiji 您的代码中的警告是,如果您错过了一天,那么   第二天你不会看到应该被禁止的人   前一天。您可能希望获取ban_date所在的所有用户   小于DateTime.now.end_of_day,可以在同一视图中或   另一个。

所以最后的查询可能是这样的

User.joins(:ban_messages)
  .where('users.status = ?', :suspended)
  .where('ban_messages.created_at = (SELECT MAX(ban_messages.created_at) FROM ban_messages WHERE ban_messages.user_id = users.id)')
  .where('ban_messages.ban_date < ?', DateTime.now.end_of_day)
  .group('users.id')