この行をハッシュ形式 (:created_at) で書くことは可能ですか?
User.where("created_at > ?", Time.now - 1.month)
User.where("created_at >= ?", DateTime.parse('2012-10-31')
この行をハッシュ形式 (:created_at) で書くことは可能ですか?
User.where("created_at > ?", Time.now - 1.month)
User.where("created_at >= ?", DateTime.parse('2012-10-31')
基本的な ActiveRecord はそれをサポートしていません。ただし、基礎となるクエリ生成ライブラリ (AREL と呼ばれます) はそうします。しかし、単純な AREL は書くのがかなり不便であり、そこでSqueel の出番です。ActiveRecord を拡張し、条件を指定するための拡張された Ruby DSL を提供します。
Squeel Gemを見てみましょう
Article.where{created_at >= 2.weeks.ago}
ドキュメントに示されているようなコードを記述できるようになります。
これは正確にはハッシュ形式ではありませんが、例よりも本当にエレガントです。
もうサポートされていないため、meta_where/squeel から離れようとしています。現在私が目にする唯一の実行可能な解決策は、AREL を掘り下げることです。
User.where(User.arel_table[:created_at].gt(1.month.ago))
User.where(User.arel_table[:created_at].gteq(DateTime.parse('2012-10-31'))
すべてのクエリ/スコープをモデルとは別のクラスに配置し、多くの冗長性をカプセル化できます。こちらをご覧ください:
これで多くの利益を得ることができます。arel がエイリアシングを処理するため、すべてのスコープのマージがうまく機能します。
個人的には、Rails 3.1+ と互換性のない meta_where に大きく依存しているため、私は現在 Rails 3.0.20 ゲットーにいます。私はゆっくりとすべての meta_where を arel に置き換えています。