помощники ruby ​​для создания текста представлений вокруг ассоциаций - PullRequest
1 голос
/ 10 июля 2011

Я не уверен, как это называется, но у меня есть модель a, которая имеет_many b.При отображении модели a в виде я хотел бы напечатать текст, описывающий все ассоциации модели b, которые он имеет, например:

"Имеет связь с foo, bar, baz и ## more... "

foo, bar, baz - это имена трех мобделов.И я не хочу печатать все имена, если их больше 3, поэтому я хочу отследить это с оставшимся количеством ассоциаций.

Я могу сделать это программно в ruby, но мне было интересно, существуют ли какие-нибудь вспомогательные методы, которые могут сделать это для меня ..

Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 июля 2011

Версия с проверкой диапазона + необязательный блок для преобразования элементов в строку:

def enumerate_as_text(seq, max, &block)
  text = seq.first(max).map { |itm|
    block_given? ? yield(itm) : itm.to_s
  }.join(", ")
  text += ", and #{seq.length - max} more" if max < seq.length
  text
end

Тестовый прогон:

blob = %w{a b c d e f g h i j}

puts blob.length
puts blob.join(", ")
puts enumerate_as_text(blob, 1)
puts enumerate_as_text(blob, 4)
puts enumerate_as_text(blob, 9)
puts enumerate_as_text(blob, 10)
puts enumerate_as_text(blob, 11)
puts enumerate_as_text(blob, 20) { |itm| "itm: #{itm}" }

Вывод:

10
a, b, c, d, e, f, g, h, i, j
a, and 9 more
a, b, c, d, and 6 more
a, b, c, d, e, f, g, h, i, and 1 more
a, b, c, d, e, f, g, h, i, j
a, b, c, d, e, f, g, h, i, j
itm: a, itm: b, itm: c, itm: d, itm: e, itm: f, itm: g, itm: h, itm: i, itm: j
0 голосов
/ 10 июля 2011

Я не вижу способа сделать это легко, и код ruby ​​/ rails получить его довольно просто Так почему бы не сделать вспомогательный метод самостоятельно? Подпись для вашего метода может быть:

def truncate_models(models, numbers)
  models[0..numbers-1].map{|m| m.name}.join(", ") + "and #{models.size - numbers} more..."
end

Итак, позвонив (по-хамлински)

.models
  Has an association with
  = truncate_models(models, 3) 

ты должен получить то, что хочешь.

...