В дополнение к ответу Тревора Джонса вы можете использовать его следующим образом:
TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.getDeviceId();
И вы должны добавить в свой файл Manifest.xml следующее разрешение:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
В эмуляторе вы, вероятно, получите значение «00000 ...». getDeviceId () возвращает NULL, если идентификатор устройства недоступен.
Простым способом с 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)
Это довольно просто сделать с простым 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">]