Ruby на Rails - использование параметра блока в качестве вызова метода - PullRequest
0 голосов
/ 12 апреля 2020

У меня проблемы с небольшим Ruby на Rails, которые я строю, и мне нужна помощь. У меня есть таблица с 20+ столбцами и соответствующий файл XML, который можно проанализировать как драгоценный камень типа ha sh. Каждый ключ будет отображен в столбце, а каждое значение будет записью данных в указанном столбце.

Способ доступа к указанному c значению в уже проанализированном файле XML:

filename["crs","inputkeyhere"]

, которое возвращает значение, например, "52" или что-то еще.

Я пытаюсь загрузить файл, разобрать его с гемом и присвоить каждому столбцу соответствующее значение.

Моя таблица (или модель) называется «Атрибут», и я уже знаю, как получить доступ к каждому столбцу:

@attributeset = Attributeset.new    
@attributeset.attributes.keys

Итак, мой мыслительный процесс был:

  1. Переберите все ключи
  2. Передайте каждый ключ в блок с именем | a |
  3. Используйте возможность rails для установки атрибутов, вызывая соответствующий @ attributeset.
  4. Установите атрибут colum на соответствующий xml ключ

Так что мой код будет go примерно так:

@attributeset.attributes.keys.each do |a|
      @attributeset.a=filename["crs",a]
 end

Но моя проблема в том, что ruby думает ".a" является методом и, по-видимому, не оценивает «a» для параметра блока. Я прочитал лямбды и проки и еще много чего, но не совсем понял, как они могут работать для моей конкретной c ситуации.

Исходя из bash сценариев, может быть, мое мышление может быть неправильным, но я подумал, что .a может быть оценен. Я знаю, что могу запустить блок с yield, но, насколько я знаю, это работает только в методах.

Любая помощь приветствуется. Спасибо и будь здоров, Алекс

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Вы можете использовать метод []= для динамической установки значений:

@attributeset.attribute_names.each do |attribute|
  @attributeset[attribute] = filename["crs", attribute]
end
0 голосов
/ 13 апреля 2020

Спасибо за вклад! Я хотел сделать его как можно более чистым и не использовать никаких временных хэшей для передачи аргументов. Я нашел метод

write_attribute

, который можно использовать так:

  @attributeset.write_attribute(a, xmp["crs",a])

отлично сработал для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...