Как разобрать Mash из LinkedIn для создания объекта Ruby

Я использовал драгоценный камень LinkedIn от pengwynn для аутентификации в LinkedIn. Все работает нормально, и я получаю Mash в обратном вызове, который выглядит так:

#<LinkedIn::Mash all=[#<LinkedIn::Mash company=#<LinkedIn::Mash id=1422 industry="Banking"    
 name="Company" size="10,001+ employees" ticker="ABC" type="Public Company"> id=2851554 
 is_current=true start_date=#<LinkedIn::Mash month=12 year=2008> summary="" title="Boss">] total=1>

Как я могу разобрать его на что-то похожее на параметры Rails, чтобы создать из него новый объект?

Спасибо.


person AdamNYC    schedule 19.11.2011    source источник


Ответы (2)


Когда вы получаете список связей любого рода от LinkedIn, вам нужно попасть в список из all. В объекте, который вы получили от LinkedIn, у вас есть {all, total}. total даст вам количество объектов в массиве, all даст вам все объекты. Итак, если вы хотите превратить первую компанию в хэш, вы должны позвонить object.all.first.to_hash. Вы можете перебрать их все, выполнив object.all.each {|c| # your block}.

Если ваши собственные модели Rails соответствуют объектам, возвращаемым из связанного гема, вы можете сделать:

companies.all.each do |company|
  Company.create(company.to_hash)
end

Если они не соответствуют 1:1, вы можете просто выбрать нужные поля:

companies.all.each do |company|
  c = Company.new
  c.name = company.name
  c.year_founded = company.start_date.year
  c.ticker = company.ticker
  # etc. etc. etc.
  c.save
end
person Sean Hill    schedule 19.11.2011
comment
Большое спасибо, Шон и Алекс. Это именно то, что мне нужно. Если не сложно, не могли бы вы помочь мне с простым примером извлечения всех объектов из всех? - person AdamNYC; 20.11.2011
comment
Я только что обновил свой ответ, чтобы включить пример. Дайте мне знать, если вам нужна дополнительная информация. - person Sean Hill; 20.11.2011
comment
Огромное спасибо, Шон. Пример действительно помогает. - person AdamNYC; 20.11.2011
comment
Привет, Шон. У меня есть быстрый дополнительный вопрос: как преобразовать вложенный Mash во вложенный Hash? Заранее спасибо. - person AdamNYC; 20.11.2011
comment
Не похоже, что вы можете сделать это, вызвав to_hash для родительского объекта. Вам нужно будет перебрать поля, как указано выше, и выполнить value.to_hash if value.is_a(Mash). - person Sean Hill; 20.11.2011
comment
Спасибо за вашу щедрую помощь. Это экономит мне много часов работы с Mash. - person AdamNYC; 20.11.2011

Вы можете просто вызвать .to_hash, чтобы превратить Mash в Hash (например, params).

Источник:

https://github.com/intridea/hashie/blob/master/lib/hashie/hash.rb

person Alex Peattie    schedule 19.11.2011