Ruby in Rails - динамическое отображение в .map - PullRequest
0 голосов
/ 10 апреля 2019

EDIT : Для пояснения я хочу, чтобы количество элементов результирующего массива массивов динамически изменялось в зависимости от количества платформ. То есть Я хочу [[35, "assetname", "platname1", "platname2", "platname3"]], а не [[35, "assetname, [" platname1 "," platname2 "," platname3 "]]].

Я использую datatables как часть моего приложения на Rails. У меня есть метод, который генерирует ассоциацию ActiveRecord и передает ее на карту. Оперативный код выглядит так:

assets.map do |asset|
[
  asset.id,
  asset.name,
  asset.thing
]

Но я хочу сделать что-то более хитрое - я хочу динамически сделать количество записей в результирующем массиве , чтобы оно было больше на основе # некоторого другого объекта. У меня есть объект под названием Платформы ... так что-то вроде этого

assets.map do |asset|
[
  asset.id,
  asset.name,
  Platforms.all.each do |line|
     line.platform_name.to_s,
  end
]

Проблема в том, что ... это проблема синтаксиса. Независимо от того, что я делаю, я не могу заставить такую ​​установку работать. Я попытался упростить - это работает (показывает 1 в последнем столбце):

assets.map do |asset|
[
  asset.id,
  asset.name,
  [1].each do |line| line.to_s end
]

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

assets.map do |asset|
[
  asset.id,
  asset.name,
  [1,2].each do |line| line.to_s end
]

Это ставит просто "1,2" в последнем столбце. В то время как я хочу 1, затем 2 в своих двух столбцах, а не «1,2» в единственном столбце.

Что касается синтаксических ошибок, которые я получаю при попытке сделать это с моим реальным объектом:

app / datatables / assets_datatable.rb: 111: синтаксическая ошибка, неожиданный ключевое слово_end, ожидание '=' app / datatables / assets_datatable.rb: 142: синтаксическая ошибка, неожиданный ключевое слово_end, ожидание ']'

Как этого добиться? Чего я хочу добиться, так это иметь результирующий массив , в котором будет больше элементов для каждого количества платформ.

1 Ответ

3 голосов
/ 10 апреля 2019

Предполагая, что у вас есть модель с именем Platform (не Platforms, поскольку модели обычно находятся в единственном числе), кажется, что это будет так просто:

platform_names = Platform.pluck(:platform_name)

assets.map do |asset|
  [
    asset.id,
    asset.name,
    platform_names
  ]
end

Естественно, platform_names будет идентичным для каждого сопоставленного asset, но я думаю, это то, что вы хотите?

Учитывая ваш комментарий, вы можете попробовать:

platform_names = Platform.pluck(:platform_name)

assets.map do |asset|
  [
    asset.id,
    asset.name
  ].concat(platform_names)
end

Или, как говорит мю:

platform_names = Platform.pluck(:platform_name)

assets.map do |asset|
  [
    asset.id,
    asset.name,
    *platform_names
  ]
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...