権限を与えるActiveRecordのテイク


私はRailsの上で質問をすることになるとき、我々が全く無力であると思います.そして、私がこれを改善することができた方法についての私の意見を私に提案して、PRをしました.

この考えの裏付け
私が解決しようとしていた問題は、私が通常直面していることです.そして、私たちのすべては、単純なクエリのために生のSQL文字列を使用しなければならないと思います.
Post.where('created_at > ?', 1.month.ago)
文字列を使うのは理想的ではないのですが、この方法が間違っているのは簡単な例です.
Post.where('created_at > ?', 1.month.ago).joins(:comments)
# run this query and you'll get an ActiveRecord::StatementInvalid (PG::AmbiguousColumn: ERROR:  column reference "created_at" is ambiguous) exception
それは別として、私はRubyを本当に愛しています、そして、私は多くのルビーとして、そして、可能な限り他のどんな言語のようにも書きたいです.

Rubyブロックでのクエリ
クエリがどのように強化されるかについての私の考えは単純です#select or #map . 以下に簡単な例を示します.
Post.where { |post| post.created_at.gt(1.month.ago) }
SQL文字列の書き込み/解析よりもはるかに優れていますか?もしAllが何であるかを知っているなら、私は値を比較するとき、私が意図的にその構文を使用することに気がつきます.あなたが何がarelであるかについて、わからないならば、速い説明はActiveRecordがフードの下で質問を構築するために使うものであるということです.
私はそれが偉大であると思うので、私はarel構文を使用しました、そして、私は複雑な質問でそれをたくさん使っているとわかります.私も、それが非常に安定していて、良い構文で大きな能力を提供すると信じています.いくつかの比較方法を連想させることもできますし、自然に見えるものもあります.
Post.where { |post| post.created_at > 1.month.ago }
私は、他のオルムが何年もこの力を持っていたことを意味しますSequel 'ドキュメント:
Post.where { num_comments < 7 }
続編のメンテナはブロックを「魔法」と言いますが、不思議なことが起こっているとは思いません.FactoryBot and RSpec 私の心に来る最初の例は、ここでブロックと大きなDSLを使用してDSLを構築しましたinstance_exec .

関連付けは?
もう一つ難しいことは、二つの異なるテーブルから属性を使ってフィルタリングすることです.
Post.join(:author).where("posts.likes > users.age")
どのブロックを使用するかは以下のように記述できます:
Post.join(:author).where { |post| post.likes.gt(post.author.age) }
どのようにして、下にあるテーブル名を参照する必要がありますが、他方では、柵にそれを理解させ、それに応じてコードを書くことができます.ちょうどもう一つのORM(上手にORMでない)をここで示すために、ここにありますEcto 'sはそれを取ります:
Post
|> join(:inner, [p], a in Author, on: p.author_id == a.id)
|> where([p, a], p.likes > a.age)
少し冗長ですが、私は本当にパワーectoが開発者に与えるように.

もっとやりましょう
私たちはデータベース側で使用することが多く、我々ははるかにそれを委任することができますし、非常に強力であり、我々は一般的に忘れているアプリケーションを使用したり、スピードアップすることができます.Postgresで検索機能を実装する方法は?のような機能を使用すると思うpg_trgm と同じくらい簡単でなければなりません
Post.where { |post| similarity(post.title, "search string") > 0.78 }
そして、DBMSから他の機能と機能性の束があります.なぜなら、それらを使用するために生のSQL文字列を使う必要があるからです.

どのように、私はこのActiveRecordブロック質問構文を得ますか?
私が言ったように、私は考えを実際のコードに変えて、それに関するPRをしました.これがチェックアウトのようにもたらされることができるかどうか見たいならばthis PR . そしてもちろん、これについて何か意見がある場合は、良いか悪いか、ここで、またはGitHubにコメントをお気軽に.