私は単純なSQLクエリタスクを作成しようとしていました。そのため、開発環境にはアクティブレコードとSQLiteを使用し、製品にはPostgreSQLを使用しました。環境
使用するDBに応じてクエリを生成できるため、ActiveRecordを使用すると思いましたが、すべてのクエリにPostgreSQLのエラーがあります。
クエリ:
@sql[0] = Task.select(:done, :deadline).order(name: :asc).distinct
@sql[1] = Task.joins(:project).group(:project_id).select("projects.name,
COUNT(*) as TaskCount").order("TaskCount DESC")
@sql[2] = Task.joins(:project).group(:project_id).select("projects.name,
COUNT(*) as TaskCount").order("projects.name ASC")
@sql[3] = Task.select("projects.name AS pName","tasks.*")
.joins(:project).where("projects.name LIKE ?",'N%')
.where("projects.name LIKE ?","%_a_%")'
@sql[4] = Project.joins("LEFT OUTER JOIN tasks
ON 'projects'.'id'='tasks'.'project_id'")
.group(:project_id)
.select("projects.*, COUNT(tasks.project_id) as TaskCount")
.where("projects.name LIKE ?","%_a_%")
@sql[5] = Task.group(:name).having("COUNT(*)>1").order(name: :asc)
@sql[6] = Task.joins(:project).where("projects.name = 'Garage'")
.group("tasks.name, tasks.done, tasks.deadline")
.having("COUNT(*)>1").select("tasks.*, COUNT(*)").order("COUNT(*) DESC")
@sql[7] = Task.where("tasks.done = ?",true).joins(:project).group(:project_id)
.having("COUNT(*)>=10").select("projects.name, COUNT(*) as TaskCount")
.order("projects.id DESC")
それらのすべてにいくつかのエラーがあります。
私はあなたがそれらを解決することを期待していません。
これはおそらく適切な答えに値します。
私の質問は、そもそもそれらをどのように回避するのでしょうか?
まず最初に-postgres用のレールガイドのコピーを手元に置いておきます。それはほとんどの拠点をカバーします。あなたは通常、野生でそれらに遭遇するでしょう-これらのような例はたくさんあります。SOはあなたを正しい方向に向けるのに非常に良い仕事をします。
開発にもPostgreSQLを使用する必要がありますか?
絶対に。Herokuはそれを頭に釘付けにします:
アプリケーションの開発と本番環境での実行の間に相違があると、小さな非互換性が発生し、開発またはステージングで機能したコードが本番環境で失敗する可能性があります。たとえば、アダプタが理論的にサービスの違いを抽象化する場合でも、開発と本番の間で異なるサービスを使用することは避けてください。ローカルでSQLiteを使用し、本番環境でPostgreSQLを使用します。または、開発時のキャッシュと本番環境でのMemcached用のローカルプロセスメモリは、最初は無害に見えるかもしれませんが、さまざまな本番環境の問題の原因となる可能性があります。
このSO投稿からもっと読む
ああ、そして:
Q:アクティブレコードの目的は何ですか?純粋なクエリを書くことはできますか?それはより良い選択のように思われるからです。(たぶん私は間違っていますか?)
人々はこの論争の両側に陥ります。アンチパターンであるため、ORMを完全に放棄すると言う人もいます。あなたは問題の両側に頑固な支持者を見つけるでしょう。
私たちが知っていることは、SQLが吐き出されることについてのかなりの量の基礎知識とともに使用されるべきであるということです。確かに便利ですが、パフォーマンスの低いクエリを実行している場合や、何かが期待どおりに機能していない場合は、準備を整えてください。必要に応じていつでも純粋なSQLを記述できます。乾杯。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加