Добавление Столбцов таблицы Группе пунктом - Ruby on Rails - Postgresql

Я пытаюсь использовать Heroku, и по-видимому Postgresql намного более строг, чем SQL для агрегатных функций. Когда я продвигаю к Heroku, я получаю ошибку при утверждении ниже.

По другому вопросу я попросил, чтобы я получил некоторое руководство, которое сказало, что я должен просто добавить столбцы к своей группе пунктом, и я не уверен, как сделать это. Посмотрите полную ошибку ниже и PostsControll#index.

SELECT posts.*, count(*) as vote_total FROM "posts"   INNER JOIN "votes" ON votes.post_id = posts.id   GROUP BY votes.post_id ORDER BY created_at DESC LIMIT 5 OFFSET 0):

PostsController

def index
    @tag_counts = Tag.count(:group => :tag_name, 
       :order => 'count_all DESC', :limit => 20)
       conditions, joins = {}, :votes

    @ugtag_counts = Ugtag.count(:group => :ugctag_name, 
       :order => 'count_all DESC', :limit => 20)
       conditions, joins = {}, :votes

    @vote_counts = Vote.count(:group => :post_title, 
          :order => 'count_all DESC', :limit => 20)
          conditions, joins = {}, :votes


       unless(params[:tag_name] || "").empty?
         conditions = ["tags.tag_name = ? ", params[:tag_name]]
         joins = [:tags, :votes]
       end
       @posts=Post.paginate(
                 :select => "posts.*, count(*) as vote_total", 
                 :joins => joins, 
                 :conditions=> conditions, 
                 :group => "votes.post_id", 
                 :order => "created_at DESC",
                 :page => params[:page], :per_page => 5)
        @popular_posts=Post.paginate(
                 :select => "posts.*, count(*) as vote_total", 
                 :joins => joins, 
                 :conditions=> conditions, 
                 :group => "votes.post_id", 
                 :order => "vote_total DESC",
                 :page => params[:page], :per_page => 3)

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @posts }
      format.json { render :json => @posts }
      format.atom
    end
  end

5
задан Community 23 May 2017 в 12:18
поделиться

2 ответа

MySQL и SQLite настолько гибки, что позволяют столбцам в списке выбора без указания имени в предложении GROUP BY (а не внутри агрегатной функции, например СЧЁТ () ). Но такой уровень гибкости может привести к неоднозначным запросам.

PostgreSQL строго соответствует стандарту ANSI SQL. Все остальные протестированные мной базы данных (Oracle, Microsoft, IBM DB2, Firebird) в этом вопросе ведут себя как PostgreSQL.

Что вам нужно сделать, так это сделать так, чтобы список столбцов сообщений в вашем списке выбора соответствовал столбцам, указанным в вашем предложении GROUP BY . Сделайте это, выбрав меньшее количество столбцов или добавив столбцы в : group .

Я не эксперт по Rails и не могу найти пример того, как передать несколько столбцов в качестве аргумента : group . Глядя на код для active_record / base.rb, кажется, что он просто копирует значение параметра в буквальное предложение SQL GROUP BY . Итак, я бы предположил (не пробуя это сделать), что вы можете сделать это:

...
:group => "posts.post_id, posts.foo, posts.bar, posts.baz", 
...

Обратите внимание, что вы должны назвать каждый столбец в вашем списке выбора, который не является частью агрегатной функции.

3
ответ дан 14 December 2019 в 19:06
поделиться

Вы пробовали просто переключиться на использование posts.id, например:

SELECT posts.*, count(*) as vote_total FROM "posts"   INNER JOIN "votes" ON votes.post_id = posts.id   GROUP BY posts.id ORDER BY created_at DESC LIMIT 5 OFFSET 0);

Если да, то как тогда набор результатов отличается от того, что вы получаете с ваш существующий SQL?

1
ответ дан 14 December 2019 в 19:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: