Есть ли функция множественного числа в Ruby NOT Rails?

Я пишу код Ruby, а не Rails, и мне нужно обработать что-то вроде этого:

found 1 match
found 2 matches

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

Редактировать: Все эти ответы были близки, но я отметил тот, который помог мне. Попробуйте этот метод в качестве помощника при написании кода Ruby, а не Rails:

def pluralize(number, text)
  return text.pluralize if number != 1
  text
end

person aarona    schedule 15.03.2010    source источник
comment
Редактировать не правильно. Нет рубиновой функции String#pluralize, вам не хватает 'active_support/inflector' или чего-то еще.   -  person gorn    schedule 21.07.2012
comment
Что ж, Rails всегда меняется. Не стесняйтесь редактировать мой вопрос, чтобы он был правильным. В настоящее время я не работаю с рельсами, поэтому у меня нет времени протестировать это и посмотреть, какой правильный способ сделать это сейчас.   -  person aarona    schedule 14.08.2012


Ответы (7)


На самом деле все, что вам нужно сделать, это

require 'active_support/inflector'

и это расширит тип String.

затем вы можете сделать

"MyString".pluralize

который вернется

"MyStrings"

для 2.3.5 попробуйте:

require 'rubygems'
require 'active_support/inflector'

должно получиться, если не попробовать

sudo gem install activesupport

а потом требует.

person scaney    schedule 16.03.2010
comment
для 2.3.5 sudo gem install activesupport require 'rubygems' require 'active_support/inflector' должен получить его. Я использую краевые рельсы (3) было много развязок, и, похоже, он связан с ним по умолчанию - person scaney; 16.03.2010
comment
Это ядро ​​множественного числа ActiveView, однако ActiveView#pluralize также знает, когда ему следует использовать множественное или единственное число, на основе первого параметра. - person the Tin Man; 03.12.2010

Инфлектор является излишним для большинства ситуаций.

def x(n, singular, plural=nil)
    if n == 1
        "1 #{singular}"
    elsif plural
        "#{n} #{plural}"
    else
        "#{n} #{singular}s"
    end
end

Поместите это в common.rb или куда вам больше нравятся ваши общие служебные функции и...

require "common" 

puts x(0, 'result') # 0 results
puts x(1, 'result') # 1 result
puts x(2, 'result') # 2 results

puts x(0, 'match', 'matches') # 0 matches
puts x(1, 'match', 'matches') # 1 match 
puts x(2, 'match', 'matches') # 2 matches 
person eukras    schedule 13.06.2010
comment
Это действительно отличное решение. Просто и действительно все, что вам нужно. - person Chris Knadler; 03.11.2012
comment
Это отлично справляется со своей задачей, действительно отличное решение. - person Benoit; 26.02.2014

Лично мне нравится жемчужина лингвистики, которая определенно не связана с rails.

# from it's frontpage
require 'linguistics'

Linguistics.use :en

"box".en.plural #=> "boxes"
"mouse".en.plural #=> "mice"
# etc
person hawx    schedule 02.05.2011

Это работает для меня (используя ruby ​​​​2.1.1 и пакет действий 3.2.17):

~$ irb
>> require 'action_view'
=> true
>> include ActionView::Helpers::TextHelper
=> Object
>> pluralize(1, 'cat')
=> "1 cat"
>> pluralize(2, 'cat')
=> "2 cats"
person EffectiveQA    schedule 06.01.2015

require 'active_support'
require 'active_support/inflector'

inf = ActiveSupport::Inflector::Inflections.new

чтобы получить инфлектор, не уверен, как вы его используете

person scaney    schedule 15.03.2010

мое решение:

# Custom pluralize - will return text without the number as the default pluralize.
def cpluralize(number, text)
  return text.pluralize if number != 1 
  return text.singularize if number == 1
end

Таким образом, вы можете вернуть «обзор», если вызовете cpluralize(1, «отзывы»)

Надеюсь, это поможет.

person Giang Nguyen    schedule 14.12.2011

Я определил для этого вспомогательную функцию, я использую ее для каждого представления индекса редактируемой пользователем модели:

  def ovyka_counter(array, name=nil, plural=nil)
    name ||= array.first.class.human_name.downcase
    pluralize(array.count, name, plural)
  end

то вы можете вызвать его из представления:

<% ovyka_counter @posts %>

для интернационализации (i18n) вы можете добавить это в свои файлы YAML локали:

  activerecord:
    models:
      post: "Conversation"
person VikoAlucard    schedule 15.02.2011