Activerecord объединяет строки с одинаковым значением столбца в один

В дополнение к ответу Тревора Джонса вы можете использовать его следующим образом:

TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); telephonyManager.getDeviceId();

И вы должны добавить в свой файл Manifest.xml следующее разрешение:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

В эмуляторе вы, вероятно, получите значение «00000 ...». getDeviceId () возвращает NULL, если идентификатор устройства недоступен.

0
задан Siddique 13 July 2018 в 20:19
поделиться

2 ответа

Простым способом с PostgreSQL было бы использовать array_agg :

ms = Model.select('"Name", "Office", array_agg("Device") as "Devices"').group(:Name, :Office)

Это даст вам Model s в ms, и каждый из них будет иметь extra Devices, который даст вам массивы строк устройств.

Или вы могли бы использовать string_agg:

ms = Model.select('"Name", "Office", string_agg("Device", ',') as "Devices"').group(:Name, :Office)

, а методы Devices предоставят вам строки вместо массивов.

Ни один из них не гарантирует какой-либо конкретный порядок для агрегации, но вы можете указать порядок , если хотите:

array_agg("Device" order by "Device")
string_agg("Device", ',' order by "Device" desc)
0
ответ дан mu is too short 17 August 2018 в 12:10
поделиться
  • 1
    Спасибо за этот ответ. Это именно то, что мне нужно. – Siddique 17 July 2018 в 00:56

Это довольно просто сделать с простым Ruby, что может быть проще, чем пытаться использовать SQL. Вот что вам поможет:

require 'ostruct'

rows = [
  OpenStruct.new(name: 'USR-A', office: 'LA-HQ', device: 'MACBOOK'),
  OpenStruct.new(name: 'USR-B', office: 'LA-HQ', device: 'MACBOOK'),
  OpenStruct.new(name: 'USR-A', office: 'LA-HQ', device: 'IMAC'),
  OpenStruct.new(name: 'USR-B', office: 'NY-HQ', device: 'IMAC'),
  OpenStruct.new(name: 'USR-B', office: 'NY-HQ', device: 'IPHONE'),
]

groups = rows.group_by { |i| "#{i.name}#{i.office}" }.values
groups = groups.map do |group|
  device = group.map(&:device).join(", ")
  OpenStruct.new(
    name: group.first.name,
    office: group.first.office,
    device: device
  )
end
p groups

=> [#<OpenStruct name="USR-A", office="LA-HQ", device="MACBOOK, IMAC">,
    #<OpenStruct name="USR-B", office="LA-HQ", device="MACBOOK">,
    #<OpenStruct name="USR-B", office="NY-HQ", device="IMAC, IPHONE">]
1
ответ дан Adam 17 August 2018 в 12:10
поделиться
  • 1
    Спасибо за Ваш ответ. Я хотел сделать это на стороне базы данных по причине производительности. – Siddique 14 July 2018 в 23:48
Другие вопросы по тегам:

Похожие вопросы: