Ruby On Railsでwhere句を使い、
ruby
1odp_this_month = OrderDownloadPlan.where(user_id: @user.id).where("expire_at = ? or expire_at >= ?", nil, date.beginning_of_month).last 2
のレコードを取得したいと思っています。
date.beginning_of_monthの値は2018-12-01で、
OrderDownloadPlan.where(user_id: @user.id)のレコードは一つだけで以下のような値が入っています。
:id => 2, :user_id => 1, :status_id => "enable", :started_at => Mon, 10 Dec 2018 00:00:00 JST +09:00, :expire_at => nil, :created_at => Tue, 11 Dec 2018 10:16:39 JST +09:00, :updated_at => Thu, 28 Feb 2019 09:44:45 JST +09:00 }
しかし、where(カラム名: 値)で取得できるレコードが、where("カラム名 = ?", 値)では取得できず、OR検索が上手くいきません。
###環境
Rails 4.2.6
###試したこと
ruby
1odp_this_month = OrderDownloadPlan.where(user_id: @user.id).where("expire_at = ?", nil)
出力
(0.5ms) SELECT COUNT(*) FROM
order_download_plans
WHEREorder_download_plans
.user_id
= 1 AND (expire_at = NULL OR expire_at >= '2018-12-01 00:00:00.000000')
[]
ruby
1odp_this_month = OrderDownloadPlan.where(user_id: @user.id).where(expire_at: nil)
出力
(0.4ms) SELECT COUNT(*) FROM
order_download_plans
WHEREorder_download_plans
.user_id
= 1 ANDorder_download_plans
.expire_at
IS NULL
OrderDownloadPlan Load (0.6ms) SELECT order_download_plans
.* FROM order_download_plans
WHERE order_download_plans
.user_id
= 1 AND order_download_plans
.expire_at
IS NULL
[
[0] #OrderDownloadPlan:0x007fadfcfedb28 {
:id => 2,
:user_id => 1,
:status_id => "enable",
:started_at => Mon, 10 Dec 2018 00:00:00 JST +09:00,
:expire_at => nil,
:created_at => Tue, 11 Dec 2018 10:16:39 JST +09:00,
:updated_at => Thu, 28 Feb 2019 09:44:45 JST +09:00
}
]
sql文を見ても、同じ処理をしているように思えます。
###知りたいこと
以下の二点について知りたいです。
・ where("カラム名 = ?", 値)とwhere(カラム名: 値)の違い
・ where("expire_at >= ?", date.beginning_of_month)とwhere(expire: nil)をORでつなぐ方法
ご教示いただけることがあれば、何卒よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/28 02:24
2019/02/28 02:31
2019/02/28 02:33