2009-11-26 18 views

risposta

18

Bene in binari, è possibile eseguire un confronto string#singularize|#pluralize per restituire un valore vero o falso.

Ma penso che a causa della natura del linguaggio stesso, potrebbe essere necessario eseguire alcuni backup per essere completamente accurati.

Si potrebbe fare qualcosa di simile

def test_singularity(str) 
    str.pluralize != str && str.singularize == str 
end 

Ma per vedere come precisa, ho eseguito una serie rapida di parole.

%w(word words rail rails dress dresses).each do |v| 
    puts "#{v} : #{test_singularity(v)}" 
end 

word : true 
words : false 
rail : true 
rails : false 
dress : false 
dresses : false 

ero un po 'sorpreso in realtà, dal momento che 'vestito' venga pluralizzato correttamente, ma quando si passa attraverso il #singularize si imbatte in un po' di un intoppo.

'dress'.pluralize # => dresses 
'dress'.singularize # => dres 
+2

Il problema "dress" .singularize è stato risolto qui: https: //rails.lighthouseapp.com/projects/8994/tickets/2399-incorrect-inflectors-for-business-or-ness # ticket-2399-5 – kikito

9

maggior parte delle volte non ho mai banco di prova per la singolarità o plurale, ho appena convertito alla forma singolare o plurale ho bisogno.

In Rails 2.3.x questo era possibile, scrivendo qualcosa di simile

plural_form = org_word.singularize.pluralize 
singular_form = org_word.pluralize.singularize 

Lavorare ulteriormente su questo, una funzione di lavoro è facile da fornire:

require 'active_support' 

def is_singular?(str) 
    str.pluralize.singularize == str 
end 


%w(word words rail rails dress dresses).each do |v| 
    puts "#{v} : #{is_singular?(v)}" 
end 

che ha pronunciato la seguente output:

word : true 
words : false 
rail : true 
rails : false 
dress : true 
dresses : false 

In Rails 4, con le parole fornite, ora è molto più semplice. Si può solo fare

plural_form = org_word.pluralize 
singular_form = org_word.singularize 

e quindi la funzione diventa molto più facile così:

require 'active_support' 

def is_singular?(str) 
    str.singularize == str 
end 
+0

Il problema "dress" .singularize è risolto qui: https://rails.lighthouseapp.com/projects/8994/biglietti/2399-errato-inflatori-per-lavoro-o-ness # ticket-2399-5 – kikito

+0

I gonfiatori assicurano che il plurale o il singolare possano essere definiti per casi difficili. Ad esempio: per la valvola è necessario. Ma la maggior parte delle volte vuoi solo singolarizzare e pluralizzare i modelli? Quindi quei casi saranno già corretti (o le tue rotte potrebbero essere incasinate). Ma la mia routine ha restituito la risposta giusta per abiti/vestiti. – nathanvda

+0

Perché scrivi al plurale per primo? – Simon

0

Né rubino né rotaie sono dotati di un metodo specifico per il test per "pluralità" di parole.

Come ha detto ora, il massimo che si può fare è implementarli da soli, confrontando con word.pluralize e word.singularize. Questo ti darà un modo di test rapido, economico e generalmente buono. Fallirà alcune volte, però.

Se è necessaria una maggiore precisione, è necessario utilizzare lo Ruby Linguistics gem, che può occuparsi correttamente di abiti e vestiti (ma è più pesante).

+0

, la roba singularize non è inclusa di default sui binari, ma può essere risolta tramite un inflector. Vedi i miei commenti su altri post. – kikito