【问题标题】:Activerecord solution to postgres-mysql problemsActiverecord解决postgres-mysql问题
【发布时间】:2011-02-09 03:42:06
【问题描述】:

我的 Job 模型中有以下范围,我的语句中似乎存在一些 SQL 差异的问题。我们的开发数据库是 mysql,显然 heroku 有 postgres,并且由于某种原因它一直抱怨为 file_count。

我打算只将这些范围转换为类方法,或者至少将 SQL 语句更改为活动记录语句,以便它可以独立于数据库。这有可能吗?我该如何开始?

我打算保留 is_active,因为我很确定它可以工作,因为它是一个简单的范围声明,但是 with_unclassified_files_available_count 需要重构,我认为 AR 重构是一个好主意(如果你认为这不是好主意,请告诉我,我愿意接受建议)

代码如下:

scope :is_active, where(:active => true)
scope :with_unclassified_files_available_count, where("audio_files.category_id IS NULL")
                                              .joins(AUDIO_FILES)
                                              .select("jobs.*, COUNT(*) AS file_count")
                                              .group("jobs.id")
                                              .order("batch_identifier DESC")
scope :has_files_available, with_unclassified_files_available_count.having("count(*) > 0")
scope :available_to_work_on, is_active.has_files_available

附加信息:

Job 有很多 audio_file,AudioFile 属于 job。

【问题讨论】:

    标签: mysql ruby-on-rails-3 postgresql activerecord


    【解决方案1】:
    .select("jobs.*, COUNT(*) AS file_count")
    .group("jobs.id")
    

    除了 MySQL,没有数据库会接受这种结构。您在 SELECT 部分中提到的不在聚合函数中的每一列(如 COUNT、MIN、MAX)都必须在 GROUP BY 中。您在 GROUP BY 中只有 jobs.id。

    您必须更改查询并提及 GROUP BY 中的所有列。

    MySQL 的这种构造也存在问题,在许多情况下它会产生奇怪/错误的结果。 MySQL 已经实现了 SQL 模式 ONLY_FULL_GROUP_BY 来关闭这种行为,MySQL 现在也会拒绝这样的查询。

    附言。 Don't use * 在您的查询中,没有人知道结果可能是什么。

    【讨论】:

      猜你喜欢
      • 2015-02-12
      • 1970-01-01
      • 2022-10-01
      • 2021-03-20
      • 1970-01-01
      • 2015-12-22
      • 2021-05-22
      • 2021-01-23
      • 1970-01-01
      相关资源
      最近更新 更多