2014-09-24 2 views
-1

Есть ли запрос:Does. Where ('field IN (?)', Array) всегда возвращают записи по порядку?

company_ids = [2,6,15,1,3] 

@people = Person.where("company_id IN (?)", company_ids) 

всегда возвращение @people отсортированный по company_ids массива?

Если нет, то было бы лучше практика, чтобы добавить .order() как:

c_ids = company_ids.collect{|c_id| "company_id = #{c_id}"} 

@people = Person.where("company_id IN (?)", company_ids).order(c_ids.join(',')) 
+0

при заказе не указано явно, то это не гарантируется. –

+0

@SergioTulentsev Я пытаюсь избежать накладных расходов на выполнение ненужного вида. Спасибо за ваш комментарий. – sscirrus

+0

Если вы _need_ записываете по порядку, то лучше сортировать их. Или проснуться в середине ночи, когда происходит перерыв в производстве. :) –

ответ

0
@people = Person.where("company_id IN (?)", company_ids).order(id: :desc).map(&:id) 

Не проверял пожалуйста, вы можете попробовать это.

+0

Вы не заказываете 'company_id' данным массивом, вы заказываете по убыванию' id', а затем собираете эти идентификаторы. – sscirrus

-1
@people = Person.where("company_id IN (?)", company_ids).order("company_id") 

Это гарантирует, что у вас всегда будет @people в заказе company_id. Прокомментируйте, если вы ожидаете чего-то еще.

+0

Это заказывает 'Лицо' согласно возрастанию company_id. Мне нужен порядок company_id, чтобы точно соответствовать массиву 'company_ids'. – sscirrus

+0

oh cool, для этого вы просто добавили «sort_by», ниже - код. '@people = Person.where (" company_id IN (?) ", Company_ids) .sort_by {| x | company_ids.index x.company_id} ' – TarunJadhwani

0

Нет, это не так.

Вы можете сделать это в SQL, но синтаксис запроса будет зависеть от используемой вами базы данных. Для MySQL что-то, как это должно работать:

@people = Person.where("company_id IN (?)", company_ids).order("field(company_id, #{company_ids.join(',')})") 

Я не думаю, что есть простой способ сделать это в PostgreSQL, но если у вас есть миллионы строк, вы можете просто сделать сортировку в Ruby:

index = Person.where("company_id IN (?)", company_ids).group_by(&:company_id) 
@people = company_ids.map{|id| index[id]}.flatten 

--- EDIT ---

Вот как вы можете сделать то же самое в PostgreSQL:

Person.where("company_id IN (?)", company_ids).order("CASE #{company_ids.map{|id| "WHEN company_id='#{id}' THEN #{company_ids.index(id)}"}.join(' ')} END;") 
+0

Мне нужно' @ people' как отсортированное отношение, и это для PostgreSQL. – sscirrus

+0

Добавлен небольшой чудовищный запрос PostgreSQL, который должен делать то, что вам нужно. – makhan

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