2017-12-22 11 views
0

データベースから最も一般的なテキスト値(国)を返そうとしています。すべてのレコードの間で最も一般的な列の値を取得します。

私の最初の試みがエラーを生成されていない一方で、私はそれが最も一般的な値を返していない疑いがある:

@mostpopularroast = Roast.group(:id).order("count(country) DESC").first 

興味深い、それは私が代わりにASCを使用する必要があり、全く同じ結果を与えます。

従って私は今、このsimilar questionからソリューションをしようとしている:

@mostpopularroast = Roast.group('country').order('count(*)').limit(1).pluck(:country).first 

しかし、これは私にエラーundefined method 'country' for "Country 1":Stringを与えています。 Country 1はdbの値です。

私のモデル

class CreateRoasts < ActiveRecord::Migration[5.1] 
    def change 
    create_table :roasts do |t| 
     t.string :roaster 
     t.string :name 
     t.string :country 
     t.string :region 
     t.string :bestfor 
     t.string :beans 
     t.string :roast 
     t.string :slug 


     t.timestamps 
    end 
    end 
end 

答えて

1

あなたはcountry最も人気を得るために発注降順適用されるべきである:

Roast.group(:country).select(:country).order("count(*) desc").first.country 

あなたの最初のエラーがこれに関連していない、それはあなたが使用しているだけのことですpluck、これはArrayオブジェクトを返します。firstメソッドを呼び出すと、オブジェクトであるStringオブジェクトが取得されますすでに最も人気のあるロースト国の名前ですが、countryを呼び出すと例外が発生します。

+0

私は ':id'でグループ化する必要があります。そうすることで元のエラーに戻ります。 –

+0

@SimonCooper:あなたが使用している正確なクエリの場合は、 ':id'をグループ化する必要はありません。 – potashin

+0

@ SimonCooper実行中のクエリと生成されたSQLクエリ出力を投稿した場合に役立ちます – potashin

関連する問題