今晚在轨道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
显然,我的理解不是我的想法,并且会赞赏一些指示/帮助
由于
答案 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子句中的所有列。
从我的国家/地区模型中获取与我的食谱模型相关联的国家/地区名称(:名称)列表(实例)
我认为实现你所描述的是不可能的,因为一个国家有很多食谱,反之亦然