2009-11-26 67 views

回答

18

那麼在rails中,您可以執行string#singularize|#pluralize比較來返回true或false值。

但我認爲由於語言本身的性質,這可能需要一些備份來做到完全準確。

你可以做這樣的事情

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

但要看到,如何準確,我跑了快組字。

%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 

我其實是有點驚訝,因爲「禮服」沒有得到正確使用複數,但是當它穿過#singularize它運行到有點障礙的。

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

「dress」.singularize問題在這裏解決:https://rails.lighthouseapp。com/projects/8994/tickets/2399-incorrect-inflectors-for-business-or-ness#ticket-2399-5 – kikito 2009-11-26 11:53:16

9

大多數時候我從不測試奇點或複數,我只是將其轉換爲單數或複數形式,我需要。

Rails的2.3.x版本這是可能的,寫這樣的事情

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

在此進一步工作,工作的功能是很容易提供:

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 

這樣做具有以下輸出:

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

Rails 4,用給定的詞語,它現在更容易了。你可以做

plural_form = org_word.pluralize 
singular_form = org_word.singularize 

,因此功能變得更加容易,以及:

require 'active_support' 

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

「dress」.singularize問題在這裏解決:https://rails.lighthouseapp.com/projects/8994 /門票/ 2399不正確的inflectors爲業務或性質#ticket-2399-5 – kikito 2009-11-26 11:54:10

+0

inflectors確保複數或單數可以爲困難的情況下定義。例如:對於閥門是必要的。但是大多數時候你只想單數化和複數化模型?所以這些情況將會被糾正(或者你的路線會被搞砸)。但是我的例程確實爲衣服/連衣裙回覆了正確的答案。 – nathanvda 2009-11-26 14:10:08

+0

爲什麼你先投複數? – Simon 2014-08-27 16:39:12

0

無論是紅寶石,也沒有欄杆都使用了測試上寫着「多」的具體方法。

正如nowk所說,你可以做的最多的是自己實現它們,與word.pluralizeword.singularize比較。這將爲您提供一種快速且便宜且通用的測試方式。不過,它會失敗一些。

如果您需要更高的精度,您將需要使用Ruby Linguistics gem,它可以正確處理衣服和連衣裙(但它更重)。

+0

實際上,單軌的東西並不是默認包含在rails上,但可以通過一個inflector來解決。查看我對其他帖子的評論。 – kikito 2009-11-26 11:55:10