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

我有两个型号:

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

Table 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'

您可以使用查询的where过滤您的用户,然后使用关联ban_messagesjoin方法以及使用日期范围进一步过滤的方法。

 User.where(status: 'suspended').joins(:ban_messages).where("ban_date >= ? AND ban_date <= ?", DateTime.now.beginning_of_day, DateTime.now.end_of_day ) 

尝试这样的事情。

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)

这就是我需要的:

 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') 

UPDATE

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

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

 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')