2017-02-20 2 views
0

В моем приложении Rails 5 я получаю эту ошибку из запроса, но я не знаю, как ее исправить.Rails - PG :: SyntaxError: ERROR: в подзапросе слишком много столбцов

PG::SyntaxError: ERROR: subquery has too many columns

Мой контроллер:

def index 
    @canvases = current_user.get_voted Canvas 
    @activities = PublicActivity::Activity.order("created_at desc").where(owner_id: current_user.friend_ids, owner_type: "User").or(PublicActivity::Activity.order("created_at desc").where(recipient_id: current_user.id)).or(PublicActivity::Activity.order("created_at desc").where("key = ? AND recipient_id in (?)", "canvas_product.create", @canvases)).paginate page: params[:page], per_page: 30 
end 

ошибка где-то в этом запросе:

(PublicActivity::Activity.order("created_at desc").where("key = ? AND recipient_id in (?)", "canvas_product.create", @canvases)) 
+0

В предположении ... '@ холсты' представляет собой набор фактических полотен, и, возможно, Rails не интерпретирует их как идентификаторы правильно ... попробуйте изменить это на:' where ("key =? И recipient_id в (?) "," Canvas_product.create ", @ canvases.map (&: id))' - если это работает, то вы знаете, что это было. –

+0

Это было! Спасибо! что я должен сделать, чтобы ограничить @canvases просто быть id перед запросом (чтобы быть более эффективным)? Спасибо! – yellowreign

+0

Я создам ответ и добавлю, что :) –

ответ

1

Похоже @canvases представляет собой набор реальных полотнах, и, возможно, Rails не интерпретируя их как идентификаторы должным образом ...

Вы можете конвертировать, что только ид как это:

where("key = ? AND recipient_id in (?)", "canvas_product.create", @canvases.map(&:id)) 

В качестве альтернативы вы можете использовать pluck на ассоциацию, чтобы срывать только идентификаторы вам нужно, например:

@canvas_ids = current_user.get_voted(Canvas).pluck(:id) 

(хотя это зависит от того, как get_voted написано)

+1

Лучше бы было что-то вроде 'where (: recipient_id => @ canvases.select (: id)) 'if' @ canvases' - это отношение. Это заставит AR использовать подзапрос и оставить работу внутри базы данных. –