对hstore属性的Activerecord范围查询,检查属性是否为nil?

时间:2017-03-16 04:15:01

标签: ruby-on-rails postgresql activerecord hstore

我的订阅模型中有一个名为expiry_date的列,用于跟踪订阅何时到期。我还有一个名为properties的hstore列,它有一个名为expiry_email_sent的属性,用作确定是否已发送电子邮件的标志。

store_accessor :properties, :expiry_email_sent

我有一个范围如下,以提取今天和接下来的5天之间有expiry_date的所有记录。它还仅提取具有nil属性的记录,或者不存在expiry_email_sent的记录。我想添加一个检查来获取expiry_email_sent为nil的记录(如果存在)。我如何在下面的范围内添加?

scope :expiry_soon_email, -> { where("expiry_date >= ? AND expiry_date <= ? AND (properties IS NULL OR EXIST(properties, 'expiry_email_sent') = FALSE", Time.zone.now.to_date, Time.zone.now.to_date + 5.days) }

1 个答案:

答案 0 :(得分:1)

您可以使用Postgres函数defined(hstore,text),这意味着

  

hstore是否包含key的非NULL值?

您的范围应该是

scope :expiry_soon_email, -> { where("expiry_date >= ? AND expiry_date <= ? AND (properties IS NULL OR DEFINED(properties, 'expiry_email_sent') = FALSE", Time.zone.now.to_date, Time.zone.now.to_date + 5.days) }

Postgres documentation中查看有关hstore函数的详细信息。