0

今晚在 rails 3 玩范围,并试图了解 lambda 的作用?

在此示例中,我要实现的是从与我的食谱模型相关联的国家模型中获取国家名称列表 (:name)。一个食谱属于国家,一个国家有很多食谱。

我想按食谱中出现的次数来订购食谱,从最高的开始..

所以我在我的食谱模型中尝试这个(或者我应该在国家模型中这样做吗?但是那将行不通,因为我的国家模型预先填充了世界上每个国家的 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实例。它的合并方法需要一个参数,即 ActievRecord::Relation 的另一个实例,而您合并字符串 Country.name。

一般来说,有效地获取顶级国家列表意味着通过一些附加条件获取国家列表。所以我会把这个逻辑放到一个国家模型中。

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),则必须手动列出 group by 子句中的所有列。

从与我的食谱模型(实例)关联的我的国家模型中获取国家名称列表(:名称)

我相信不可能实现你所描述的,因为一个国家有很多食谱,反之亦然

于 2012-12-11T19:51:05.820 回答