我有两种模式:
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'
之间。
答案 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')