滑轨。为什么要使用ActiveRecord?

Iho*_*alo 4 sql postgresql activerecord ruby-on-rails ruby-on-rails-4

我试图做简单的SQL查询任务。因此,我在自己的开发环境中使用了Active Record和SQLite,而在我的产品中使用了PostgreSQL。环境

我认为使用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")
Run Code Online (Sandbox Code Playgroud)

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

我不希望您解决它们

  • 我的问题是我如何首先避免它们?
  • 我也应该使用PostgreSQL进行开发吗?
  • 主动记录的目的是什么?我可以只编写纯查询吗?因为这似乎是一个更好的选择。(也许我错了?)

小智 5

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

我的问题是我如何首先避免它们?

首先要做的事情-随手准备一份postgresrails指南。那将覆盖大多数基地。你通常会遇到他们在野外-类似的例子,这些比比皆是。这样可以很好地为您指出正确的方向。

我也应该使用PostgreSQL进行开发吗?

绝对。Heroku将其钉在头上

应用程序的开发与其在生产中的执行之间的任何差异都可能导致极小的不兼容性,从而导致在开发中起作用或暂存的代码在生产中失败。例如,即使适配器理论上消除了服务中的任何差异,也要避免在开发和生产之间使用不同的服务。在本地使用SQLite,在生产中使用PostgreSQL;或用于开发中缓存和生产中Memcached的本地进程存储器,乍一看似乎无害,但可能是导致各种生产问题的原因。

这篇SO帖子中获得更多阅读

哦,还有:

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

人们处于这种争论的两面。有人说我们只是完全放弃了ORM,因为它是一种反模式。您会在问题的两面都找到坚定的支持者。

我们所知道的是,它是一个有用的工具,应该与大量有关SQL吐出的基础知识一起使用。它当然很方便,但是如果发现执行的查询性能不佳或某些操作没有按预期进行,请做好准备,如果需要,您可以随时编写纯SQL。干杯。