2015-06-26 16 views
4

我试图做简单的SQL查询任务。所以我用PostgreSQL为我的产品使用了活动记录和SQLite来开发我的开发环境。 ENV。导轨。为什么我应该使用ActiveRecord?

我以为使用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") 

他们每个人都有一些错误。

我不指望你解决它们

  • 我的问题如何避免他们在第一个地方?
  • 我是否应该使用 PostgreSQL进行开发?
  • 活动记录的目的是什么呢?我可以只写纯粹的查询吗?因为它似乎是一个更好的选择。 (也许我错了?)
+0

[轨原始SQL示例](http://stackoverflow.com/questions/14824453/rails-raw-sql-example) – felipsmartins

+0

我认为你的问题标签是错误的。考虑至少添加“rails”标签。 –

+1

“我以为使用ActiveRecord是因为它可以根据使用的数据库生成查询,但是我的所有查询都有一些PostgreSQL错误。”嗯不,AR不能提供有用的可移植性,声称这是非常错误的人。如果您正在部署PostgreSQL,那么您还需要开发和测试PostgreSQL。 –

回答

4

这可能值得一个适当的答案。

我的问题如何避免他们在第一个地方?

首先要做的事情 - 保留rails guides for postgres方便的副本。这将涵盖大部分基地。你通常会在野外遇到他们 - 例如these比比皆是。因此,SO指导你朝着正确的方向做得很好。

我是否应该使用PostgreSQL进行开发?

绝对。 Heroku的nails it on the head

应用程序的开发及其在生产执行可引起微小的不兼容之间的任何分歧,导致在开发工作的代码或暂存在生产中失败。例如,避免在开发和生产之间使用不同的服务,即使适配器在理论上抽象出服务中的任何差异。本地使用SQLite和PostgreSQL进行生产;或者本地进程内存用于开发中的缓存和生产中的Memcached,可能起初似乎无关紧要,但可能是各种生产问题的原因。

更多阅读从this SO post

哦,还有:

问:什么活动记录的目的呢?我可以只写纯粹的查询吗?因为它似乎是一个更好的选择。 (也许我错了?)

人们在此竞争的both sides。有人说我们完全放弃了ORM,因为它是一个antipattern。问题的双方都会发现坚定的支持者。

我们所知道的是,它是一个有用的工具,应该使用有关SQL获取吐出的大量底层知识。它当然是方便的,但是如果你发现你正在执行不能正常的查询或者某些事情没有按预期工作,就要准备好袖手旁观 - 你可以在需要时写pure SQL。干杯。


相关问题