0

今夜、Rails 3でスコープを使って遊んで、ラムダが何をするのか頭を悩ませようとしていますか?

この例で達成しようとしているのは、レシピモデルに関連付けられている国モデルから国名(:name)のリストを取得することです。レシピはcountry_to国に属し、国には多くのレシピがあります。

レシピに登場する回数の多いものから順に並べていきたいです。

だから私はレシピモデルでこれを試しています(または国モデル内でそれを行う必要がありますか?しかし、私の国モデルには世界のすべての国の1つのインスタンスが事前に入力されているため、それは機能しません)

scope :top_countries, lambda { joins(:countries).merge(Country.name).order("name DESC") }

ただし、このエラーメッセージが表示されます

undefined method `default_scoped?' for "Country":String

私のコントローラー

@toprankingcountry = Recipe.top_countries

明らかに私の理解は私が思ったものではなく、いくつかの指針/支援をいただければ幸いです

ありがとう

4

1 に答える 1

2

問題はmerge(Country.name)部分にあると思います。joins(:countries)はActiveRecord::Relationインスタンスを返します。そのmergeメソッドは、文字列Country.nameをマージするのに対し、ActievRecord::Relationの別のインスタンスである1つの引数を想定しています。

一般的に言えば、上位の国のリストを取得することは、効果的に国のリストを追加の条件で取得することを意味します。したがって、このロジックを国モデルに入れます。

class Country
  has_many :recipes

  def self.top_countries
    joins(:recipes).
      select('countries.*, count(*) AS recipes_count').
      group('countries.id').
      order('recipes_count DESC')
  end
end

また、依存する行を単独で把握できないRDBMSを使用している場合(PostgreSQL <9.1など)、groupby句内のすべての列を手動で一覧表示する必要があります。

レシピモデル(インスタンス)に関連付けられている国モデルから国名(:name)のリストを取得します

国にはレシピがたくさんあるので、あなたが説明したことをそのまま達成することは不可能だと思います。その逆ではありません。

于 2012-12-11T19:51:05.820 に答える