2014-12-15 7 views
0

Я переписал этот вопрос, поскольку мое предыдущее объяснение вызывало путаницу.Как я могу запросить подмножество записей ActiveModel?

В мире SQL у вас есть начальный набор записей , к которому применяется запрос. Результатом этого запроса является результат . Как правило, набор начальных записей представляет собой всю таблицу записей, а набор - это записи из набора начальных записей , которые соответствуют набору правил запроса.

У меня есть прецедент, в котором мне нужно мое приложение, чтобы иногда работать только с подмножеством записей в таблице. Если в таблице содержится 10 000 записей, я бы хотел, чтобы мое приложение вел себя, как только первые 1000 записей существуют. Они должны быть одинаковыми 1000 записей каждый раз. Другими словами, я хочу, чтобы начальный набор был первым 1000 устройств в таблице (при заказе по первичному ключу) и результат результирующих записей с этих первых 1000 устройств.

Были предложены некоторые решения, и выяснилось, что мое первоначальное описание было не очень ясным. Чтобы быть более явным, я не пытаюсь реализовать разбиение на страницы. Я также не пытаюсь ограничить количество полученных результатов (что действительно достигнет .limit(1,000)).

Спасибо!

+0

Можете ли вы изложить на прецеденте, который вы пытаетесь укрыть? Я не понимаю, пытаетесь ли вы работать только с первыми 4 записями или вы хотите работать только с элементами, которые не являются первыми четырьмя. – tagCincy

+0

Я не уверен, как прервать ваш вопрос, поскольку это мало смысла. Какова ваша конечная цель? В Paginate? –

+0

Проще говоря, я хочу выполнить запрос к подразделу таблицы, а не ко всей таблице. В качестве примера я ищу запрос по строкам «вернуть записи, где some_attribute = 100 из первых 100 записей в таблице (при заказе« id »)« –

ответ

-2

Вы можете специально попросить набор идентификаторов:

Device.where(id: (1..4).to_a) 

Это построит WHERE пункт как:

WHERE id IN (1,2,3,4) 
+1

Не нужно передавать диапазон функции 'to_a' в' where' – tagCincy

+0

Единственное различие заключалось бы в том, что диапазон заставляет запрос строить предложение BETWEEN, а не IN. – DiegoSalazar

+0

Я не пытаюсь напрямую запросить объекты 1-4, скорее, я пытаюсь запросить первые четыре объекта. В этом случае они оказываются одинаковыми. –

-1

Это линия в вашем вопросе, что я не понимаю:

Это вызывает проблемы, хотя и с обоими вызовами, так как лимит ограничивает результаты запроса, а не строки базы данных, которые запрос выполняется.

Это не вещь Rails, это вещь SQL.

Device.limit(n) работает SELECT * FROM device LIMIT n

Предел всегда возвращает подмножество запрашиваемых результирующего набора.

Будет first(n) выполнить то, что вы хотите? Он будет заказывать результирующий набор, восходящий на ПК, и ограничивать количество возвращенных результатов.

+0

Это приближается. Я хочу ограничить набор запросов, а не набор результатов. –

+0

@YWCAHello, как бы вы это сделали с SQL? – tagCincy

+0

Отличный вопрос! И у кого, к сожалению, нет ответа. –

-1

Заявления SQL могут быть соединены вместе. Поэтому, если у вас есть подмножество, вы можете выполнить с ним дополнительные запросы.

my_subset = Device.where(family: "Phone") 
# SQL: SELECT * FROM Device WHERE `family` = "Phone" 

my_results = my_subset.where(style: "Touchscreen") 
# SQL: SELECT * FROM Device WHERE `family` = "Phone" AND `style` = "Touchscreen" 

Что также можно записать в виде:

my_results = Device.where(family: "Phone").where(style: "Touchscreen") 
my_results = Device.where(family: "Phone", style: "Touchscreen") 
# SQL: SELECT * FROM Device WHERE `family` = "Phone" AND `style` = "Touchscreen" 

Из вашего вопроса, если вы хотите, чтобы выбрать первые 1000 строк (упорядоченный по первичному ключу, pkey), а затем запросить против этого, вам необходимо будет:

my_results = Device.find_by_sql("SELECT * 
          FROM (SELECT * FROM devices ORDER BY pkey ASC LIMIT 1000) 
          WHERE `more_searching` = 'happens here'") 
+0

Я обновил вопрос, чтобы быть более понятным. Я не пытаюсь ограничить количество возвращаемых результатов, я пытаюсь ограничить количество исходных записей, которые я запрашиваю, перед первыми «x» записями в таблице. –

+0

В sql вам нужно будет сделать какой-то запрос в наборе данных ENTIRE, чтобы получить подмножество данных, тогда вы можете делать все, что хотите. Там, где этот запрос просто возвращает первые 1000 записей или проверяет некоторый столбец. –

+0

Невозможно выполнить запрос по «магическому» подмножеству строк, поскольку он не имел бы представления о том, какое подмножество запрашивать, по вашему (пересмотренному) вопросу вы упомянули первые 1000 строк, таким образом, ваш запрос будет использоваться, чтобы получить первые 1000 строки в качестве подмножества, а затем выполнить остальную часть вашего запроса. –

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