范围,lambda和rails 3

时间:2012-12-11 19:39:23

标签: ruby-on-rails ruby-on-rails-3 model lambda scope

今晚在轨道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

显然,我的理解不是我的想法,并且会赞赏一些指示/帮助

由于

1 个答案:

答案 0 :(得分:2)

我认为问题出在 merge(Country.name)部分。 加入(:国家/地区)会返回 ActiveRecord :: Relation 实例。它的merge方法需要一个参数,它是ActievRecord :: Relation的另一个实例,而你合并字符串Country.name。

一般而言,有效获取最佳国家/地区列表意味着通过某些附加条件获取国家/地区列表。所以我将这个逻辑放入Country模型中。

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子句中的所有列。

  

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

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