【问题标题】:Rails. Why should i use ActiveRecord?导轨。为什么要使用 ActiveRecord?
【发布时间】:2015-06-26 18:03:34
【问题描述】:

我试图做简单的 SQL 查询任务。因此,我将活动记录和 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")

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

我不希望你解决它们

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

【问题讨论】:

  • 我认为你的问题标签是错误的。至少考虑添加“rails”标签。
  • "我认为使用 ActiveRecord 是因为它可以根据使用的数据库生成查询,但我所有的查询对于 PostgreSQL 都有一些错误。"嗯,不,AR 并没有提供太多有用的可移植性,人们声称这是非常错误的信息。如果您在 PostgreSQL 上进行部署,那么您也需要在 PostgreSQL 上进行开发和测试。

标签: sql ruby-on-rails postgresql ruby-on-rails-4 activerecord


【解决方案1】:

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

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

首要任务 - 随身携带一份 rails guides for postgres 的副本。这将涵盖大多数基地。你通常会在野外遇到它们——像these 这样的例子比比皆是。 SO 在为您指明正确方向方面做得非常好。

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

当然。 Herokunails it on the head:

应用程序的开发与其在生产中的执行之间的任何差异都可能导致微小的不兼容性,从而导致在开发中工作的代码或在生产中暂存的代码失败。 例如,避免在开发和生产之间使用不同的服务,即使适配器理论上抽象出服务中的任何差异。在本地使用 SQLite,在生产中使用 PostgreSQL;或本地进程内存用于开发中的缓存和生产中的 Memcached,起初可能看起来无害,但可能会导致各种生产问题。

更多阅读来自this SO post

哦,还有:

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

人们相信both sides 的这种争论。有人说我们完全放弃了 ORM,因为它是一个antipattern。你会在问题的两边找到坚定的支持者。

我们所知道的是,它是一个有用的工具,应该与大量关于 SQL 吐出的基础知识一起使用。这当然很方便,但是如果您发现自己正在执行性能不佳的查询或某些事情没有按预期工作,请准备好卷起袖子 - 您可以随时在需要时写 pure SQL。干杯。


【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    相关资源
    最近更新 更多