2016-01-20 2 views
1

Зная, что по умолчанию Rails заказывает данные по ID, как я могу заказать идентификаторы, заданные для предложения where?Рельсы, где состояние и порядок

ids = Bookmark.where(user_id: 7).order(created_at: :desc).pluck(:company_id) 

Результат:

[146, 140, 128, 4, 2]

Теперь, когда я пытаюсь получить компании в том же порядке ids

Company.where(id: ids).pluck(:id) 

Результат:

[2, 4, 128, 140, 146]

Ожидаемый результат:

[146, 140, 128, 4, 2]

Мои притворный результат будет одинаковым в обоих случаях (тот же порядок). Компании должны быть возвращены в том же порядке, что и закладки, созданные в этой компании.

ответ

1

Похоже, что с учетом ID пользователя вы хотите получить список компаний, отсортированных по дате добавления, которые присоединяются к пользователям и компаниям.

Правильно ли я полагаю, что пользователи и компании разделяют отношения «многие ко многим» через закладки?

Если это так, для вас может работать следующее «соединение»!

Company.joins(:bookmarks).where('bookmarks.user_id = ?', 7).order('bookmarks.created_at') 

Конечно, в вашем коде это может быть обобщено для захвата компаний для любого пользователя!

user_id = 42 
companies = Company.joins(:bookmarks).where('bookmarks.user_id = ?', user_id).order('bookmarks.created_at') 

ActiveRecord "joins" reference

0

Вы явно упорядочиванием по created_at в order(created_at: :desc)

Вы хотите заказать по company_idids = Bookmark.where(user_id: 7).order(:company_id).pluck(:company_id)

+0

Я считаю, что это будет сортировать по 'id' на' bookmarks', а не '' pluck'ed company_id'. – JackCollins

+0

@JackCollins Спасибо, я обновил свой ответ. –

+0

@RayBaxter Я обновил вопрос, чтобы уточнить порядок, который я хочу в компаниях. –

0

Что именно вы пытаетесь сделать заказ по ... в company_id?

pluck возвращает массив, который является, почему это не работает:

ids = Bookmark.where(user_id: 7).pluck(:company_id).order(company_id: :desc) 
## undefined method `order' for Array 

Вместо этого, вы можете вызвать sort на массиве.

ids = Bookmark.where(user_id: 7).pluck(:company_id).sort 

Это должно сделать трюк

+0

Я не сортирую массив, я хочу, чтобы компании того же порядка со дня создания Закладок. –

1
Company.includes(:bookmarks) .where(id: ids).order('bookmarks.created_at desc').pluck(:id) 
+0

Мне нужны компании, отсортированные по столбцу created_at из таблицы закладок, а не таблицы компании. –

+0

отредактирован, проверьте его –

0

Возможно, вы можете попробовать это:

company_by_id = Company.find(ids).index_by(&:id) # Gives you a hash indexed by ID 
ids.collect {|id| company_by_id[id].id } 
+0

Ваш ответ не работает, по крайней мере, в PostgreSQL. –

+0

Я обновил свой ответ для PostgreSQL, пожалуйста, проверьте его там – Yang

0

Это, как я решил вопрос:

Bookmark.includes(:company).where(user_id: current_user).order(created_at: :desc) 

и когда итерации по элементам, которые я использую:

record.company вместо record.

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

+1

Я столкнулся с этой проблемой раньше. Я закончил использовать Gunchars ответ от [здесь] (http://stackoverflow.com/questions/1680627/activerecord-findarray-of-ids-preserving-order). Я думаю, что это быстрее, чем повторение записей закладок в этом ответе. Надеюсь, поможет. –

+0

@ Jay-ArPolidario Мне нужно итератировать в представлении. Но спасибо, что указали это. –

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