2013-04-26 1 views
3

Я пытаюсь восстановить таблицу из следующих действий таблице:Рельсы и PostgresSQL проблема с Имея

столбцов: ID, имя, статус, PRODUCT_ID, User_ID и ряд других, не соответствующие колонки для этой проблемы.

Каждый раз, когда пользователь хочет получить продукт, я создаю запись следующим образом: Name = Want, Status = True, Product_ID = идентификатор продукта, а User_ID - это идентификатор пользователя.

Затем каждый раз, когда пользователь не создает продукт, я создаю запись следующим образом: Name = Want, Status = False, Product_ID = идентификатор продукта, а User_ID - это идентификатор пользователя.

Я сделал это, потому что у меня есть другое имя действия в моем столе.

Теперь я хотел бы получить весь необходимый продукт, поэтому я должен получить все последние действия, сгруппированные по product_id для определенного пользователя, упорядоченного по убыванию created_at, а затем получить только действие, в котором status = true.

Так, чтобы получить все последние хотите действий, сгруппированных по product_id для Пользователя я сделал, что:

Action.select("DISTINCT ON (product_id) product_id,created_at, status, * ").where{(user_id == id) & (name == 'want')}.group("product_id, id, status").order(' product_id,created_at DESC') 

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

Я попытался сделать это следующим образом:

Action.select("DISTINCT ON (product_id) product_id,created_at, status, * ").where{(user_id == id) & (name == 'want')}.group("product_id, id, status").having("status = 'true'").order(' product_id,created_at DESC') 

Но это дало бы мне последние действия, где требуется = истина. Если последним действием является статус = false, он будет извлекать тот, который был до этого, когда status = true.

Я действительно надеюсь, что это достаточно ясно,

Спасибо за вашу помощь

Вот идея о том, что я хочу, но я понятия не имею, как добиться того, что с рельсов: http://sqlfiddle.com/#!9/e4117/3

ответ

1

Вы можете попробовать добавить подзапрос к условиям и удалить группу:

Action. 
    where(user_id: id, name: "want", status: "true"). 
    where(["id IN (SELECT max(id) FROM actions WHERE user_id = ? 
       AND name = 'want' GROUP BY product_id)", id]). 
    order("product_id") 

Вам нужно будет r ely по порядку столбца id - это последнее действие для правильной работы. Если вы не можете сделать, что вы могли бы использовать DISTINCT ON в подвыборки:

Action. 
    where(user_id: id, name: "want", status: "true"). 
    where(["id IN (SELECT DISTINCT ON (product_id) id FROM actions 
       WHERE user_id = ? AND name = 'want' 
       ORDER BY product_id, created_at DESC)", id]). 
    order("product_id") 
+0

Если я что, что даст мне все состояние верно, но если у меня есть что: последний пункт является статус ложным и Рассматриваемый последнее верно, это даст мне элемент до последнего. Я хочу, чтобы он ничего не возвращал, если это не последний элемент. Спасибо, –

+0

отредактировал мой ответ – lassej

+0

Спасибо только одному вопросу: ORDER BY product_id, created_at DESC) ", user_id]). order (" product_id ") должен user_id быть id? Спасибо, –

 Смежные вопросы

  • Нет связанных вопросов^_^