Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails SQLite/Postgres/Heroku:翻译查询时出现问题_Ruby On Rails_Ruby On Rails 3_Sqlite_Postgresql_Heroku - Fatal编程技术网

Ruby on rails SQLite/Postgres/Heroku:翻译查询时出现问题

Ruby on rails SQLite/Postgres/Heroku:翻译查询时出现问题,ruby-on-rails,ruby-on-rails-3,sqlite,postgresql,heroku,Ruby On Rails,Ruby On Rails 3,Sqlite,Postgresql,Heroku,Heroku在我的Postgres查询中抛出一个错误,声明: ActiveRecord::语句无效 (PGError:ERROR:or处的语法错误 接近“日期”2011-05-03T13:58:22+00:00 应用[web.1]:第1行:…2011-05-31') 按提取分组(从时间戳算起的年份) 日期)| |分机 开发中的SQLite查询按预期工作。代码如下: def self.calculate(year, month, user_id, partner_id) case Ac

Heroku在我的Postgres查询中抛出一个错误,声明:

ActiveRecord::语句无效 (PGError:ERROR:or处的语法错误 接近“日期”2011-05-03T13:58:22+00:00 应用[web.1]:第1行:…2011-05-31') 按提取分组(从时间戳算起的年份) 日期)| |分机

开发中的SQLite查询按预期工作。代码如下:

  def self.calculate(year, month, user_id, partner_id)
    case ActiveRecord::Base.connection.adapter_name  
      when 'SQLite'
        where(':user_id = entries.user_id OR :partner_id = entries.user_id', {    
            :user_id => user_id,
            :partner_id => partner_id
        }).
        where('entries.date <= :last_day', { 
            :last_day => Date.new(year, month, 1).at_end_of_month
        }).
        select('entries.date, ' + 
               'sum(case when joint = "f" then amount_calc else 0 end) as sum_private, ' + 
               'sum(case when joint = "t" and user_id = ' + user_id.to_s + ' then amount_calc else 0 end) as sum_user_joint, ' + 
               'sum(case when joint = "t" and user_id = ' + partner_id.to_s + ' then amount_calc else 0 end) as sum_partner_joint, ' +              
               'sum(case when compensation = "t" and user_id = ' + user_id.to_s + ' then amount_calc else 0 end) as sum_user_compensation, ' +
               'sum(case when compensation = "t" and user_id = ' + partner_id.to_s + ' then amount_calc else 0 end) as sum_partner_compensation '
        ).
        group("strftime('%Y-%m', date)")
      when 'PostgreSQL'
        where(':user_id = entries.user_id OR :partner_id = entries.user_id', {    
            :user_id => user_id,
            :partner_id => partner_id
        }).
        where('entries.date <= :last_day', { 
            :last_day => Date.new(year, month, 1).at_end_of_month
        }).
        select('entries.date, ' + 
               'sum(case when joint = "f" then amount_calc else 0 end) as sum_private, ' + 
               'sum(case when joint = "t" and user_id = ' + user_id.to_s + ' then amount_calc else 0 end) as sum_user_joint, ' + 
               'sum(case when joint = "t" and user_id = ' + partner_id.to_s + ' then amount_calc else 0 end) as sum_partner_joint, ' +              
               'sum(case when compensation = "t" and user_id = ' + user_id.to_s + ' then amount_calc else 0 end) as sum_user_compensation, ' +
               'sum(case when compensation = "t" and user_id = ' + partner_id.to_s + ' then amount_calc else 0 end) as sum_partner_compensation '
        ).
        group("EXTRACT(YEAR FROM TIMESTAMP date)||EXTRACT(MONTH FROM TIMESTAMP date)")
    else
      raise 'Query not implemented for this DB adapter'
    end
  end
…工作正常

我的另一个陈述现在遇到了麻烦,我在这里编辑它,因为它似乎与peufeu的答案有关。型号/控制器:

   def self.all_entries_month(year, month, user_id, partner_id)
    mydate = Date.new(year, month, 1)

    where(':user_id = entries.user_id OR (:partner_id = entries.user_id AND entries.joint = :true)', {
        :user_id => user_id,
        :partner_id => partner_id,
        :true => true
    }).
    where(':first_day <= entries.date AND entries.date <= :last_day', { 
        :first_day => mydate,
        :last_day => mydate.at_end_of_month
    })
  end

  # group by tag and build sum of groups named group_sum
  def self.group_by_tag
    group('tag').
    select('entries.*, sum(amount_calc) as group_sum')
  end
@income = Entry.all_entries_month(@year, @month, current_user.id, current_partner.id).income
@cost = Entry.all_entries_month(@year, @month, current_user.id, current_partner.id).cost

# group cost by categories
@group_income = @income.group_by_tag.order('group_sum desc')
@group_cost = @cost.group_by_tag.order('group_sum')
错误是:

ActionView::Template::Error (PGError: ERROR:  column "entries.id" must appear in the GROUP BY clause or be used in an aggregate function
2011-05-03T18:35:20+00:00 app[web.1]: : SELECT entries.*, sum(amount_calc) as group_sum FROM "entries" WHERE (1 = entries.user_id OR (2 = entries.user_id AND entries.joint = 't')) AND ('2011-04-01' <= entries.date AND entries.date <= '2011-04-30') AND (amount_calc <= 0 AND compensation = 'f') GROUP BY tag ORDER BY group_sum):
2011-05-03T18:35:20+00:00 app[web.1]:     6:    </thead>
2011-05-03T18:35:20+00:00 app[web.1]:     7:    <tbody>
2011-05-03T18:35:20+00:00 app[web.1]:     8:        <% if categories %>
2011-05-03T18:35:20+00:00 app[web.1]:     9:            <% categories.each do |category| %>     
2011-05-03T18:35:20+00:00 app[web.1]:     10:               <tr>
2011-05-03T18:35:20+00:00 app[web.1]:     11:                   <td class="align-left"><%= category.tag %></td>
2011-05-03T18:35:20+00:00 app[web.1]:     12:                   <td class="align-right"><%= my_number_to_percentage (category.group_sum.to_f / total_cost) * 100 %></td>

我不知道ruby/heroku,但是这个表达式

joint=“t”

引用PostgreSQL中的
t
,因为对象名称用双引号引起来。所以除非Ruby/Heroku用单引号替换那些双引号,否则这将是一个无效的条件

如果
t
应该是字符串文字(字符t),则需要使用单引号:
joint='t'


如果
joint
属于
boolean
类型,那么您应该在PostgreSQL中使用
joint=true
,我不知道ruby/heroku,但是表达式

joint=“t”

引用PostgreSQL中的
t
,因为对象名称用双引号引起来。所以除非Ruby/Heroku用单引号替换那些双引号,否则这将是一个无效的条件

如果
t
应该是字符串文字(字符t),则需要使用单引号:
joint='t'

如果
joint
属于
boolean
类型,则应在PostgreSQL中使用
joint=true
问题在于:

EXTRACT(YEAR FROM TIMESTAMP date)||EXTRACT(MONTH FROM TIMESTAMP date)
解决方案:

EXTRACT(YEAR FROM "date"), EXTRACT(MONTH FROM "date")
“时间戳”这个词有点不合适;)。。。此外:

由于DATE是一个保留的SQL关键字,所以将其用作列名是一个非常糟糕的主意。在这里,我引用了“所以博士后不会感到困惑”

而且您不需要浪费CPU时间来构建连接两个提取的字符串,只要记住GROUPBY可以使用多个参数

当然,查询将失败,因为您选择了“日期”,但不按日期分组。postgres无法从所有具有相同年-月的行中知道您想要哪个日期。MySQL将从这些行中随机返回一个值,postgres喜欢正确性,因此会抛出错误。您可以选择min(日期)例如,这是正确的

当joint=“t”时,我不确定该情况

这取决于你想如何得到你的结果,没有错

可能使用多个查询会扫描表的一小部分(我不知道您的数据集),也可能不扫描。

问题在于:

EXTRACT(YEAR FROM TIMESTAMP date)||EXTRACT(MONTH FROM TIMESTAMP date)
解决方案:

EXTRACT(YEAR FROM "date"), EXTRACT(MONTH FROM "date")
“时间戳”这个词有点不合适;)…还有:

因为DATE是一个保留的SQL关键字,所以将它用作列名是一个非常糟糕的主意

而且您不需要浪费CPU时间来构建连接两个提取的字符串,只要记住GROUPBY可以使用多个参数

当然,查询将失败,因为您选择了“日期”,但不选择“按日期分组”。postgres无法从所有具有相同年-月的行中知道您想要的日期。MySQL将从行中随机返回一个值,postgres喜欢正确性,因此它将抛出一个错误。例如,您可以选择min(日期),这是正确的

当joint=“t”时,我不确定该情况

这取决于你想如何得到你的结果,没有错


可能使用几个查询会扫描表的一小部分(我不知道您的数据集),也可能不会。

只要其他问题(我的主要问题)得到解决,我就不能尝试这样做,但是,我已经在postgres分支中将“t”改为true,“f”改为false。谢谢你指出这一点!只要另一个问题(我的主要问题)得到解决,我就不能尝试这样做,但是,我已经在博士后分院将“t”改为true,“f”改为false。谢谢你指出这一点!关于时间戳的好消息。我没有看到这个,嗯,这看起来像一个Ruby例外,也许你应该做“选择min(date)作为日期”(即给它一个名字)?…时间戳的好捕捉。我没有看到这个,嗯,这看起来像一个Ruby例外,也许你应该做“选择min(date)作为date”(即给它一个名字)?…有人不得不说:如果你要部署到Heroku,你应该在PostgreSQL之上开发。或者,更一般地说,您应该始终在部署的堆栈上进行开发。嗯……我不能对此提出太多异议。另一方面,我在本地也会遇到同样的问题;)但它在开发过程中会被修复,您会在数据库接口问题发生时就知道问题所在,而不是在最后一次尝试查找所有问题时陷入困境。实际上,我使用早期原型进行了早期部署,该原型仅包括种子文件、查询和两个基本视图。尚未实现任何交互。我以前就知道我会遇到Postgres的麻烦:)有人不得不说:如果要部署到Heroku,应该在PostgreSQL之上开发。或者,更一般地说,您应该始终在部署的堆栈上进行开发。嗯……我不能对此提出太多异议。另一方面,我在本地也会遇到同样的问题;)但它在开发过程中会被修复,您会在数据库接口问题发生时就知道问题所在,而不是在最后一次尝试查找所有问题时陷入困境。实际上,我使用早期原型进行了早期部署,该原型仅包括种子文件、查询和两个基本视图。尚未实现任何交互。我以前就知道我会遇到博士后的麻烦:)