从activeladord hash获取所有内容

时间:2011-11-16 17:35:21

标签: ruby-on-rails ruby activerecord

我的模特 Campain 有很多媒体

我这样做:

Campain.all.medias

但是得到这个错误:

 undefined method `medias' for #<Array:0x00000004bbaf40>

如何从Campain.all获取所有媒体?

4 个答案:

答案 0 :(得分:4)

更好的方法是使用此代码:

Campaign.includes(:media).map(&:media)

(用过的英语语法,我希望你能得到主要的想法)。这将获得两个请求。

--- --- EDIT

如果媒体 - has_many是关联,确实返回的形式为:[[...],[..]]所以在这种情况下使用flaten使其成为简单的数组。 如果所有Medium都需要使用Camplaign个数组group方法来收集唯一或仅仅简单的uniq。这种使用Rails类的方法更可取,因为它更通用且可配置,例如它将应用任何默认范围,可能在Campaign上。

答案 1 :(得分:0)

刚刚完成Dylans Post - 我今天升级到Rails 3.1.1。我的应用程序有大约60个模型,其中一个名为Media,当英语不好时,它的效果很好。所以我升级了,我认为他们修补了pluralize方法。我无法打电话给媒体行动,铁路表说桌子&#39;媒体&#39;并不存在,当我意识到我的表被称为media时,因为我使用rails 3.0.3来创建模型。我重命名了模型,控制器和视图名称,将路由从resources :medias更新为ressources :media作为快速修复,然后又重新运行了!

答案 2 :(得分:0)

如果您要查找具有关联广告系列的所有媒体,则应通过Media对象进行查询,而不是Campaign对象。这将为您提供一个Media对象数组,并且只接受一个查询(假设您的Media对象具有campaign_id [即Media :belongs_to :campaign])。

Media.where("campaign_id is not null").all

答案 3 :(得分:-1)

就Rails而言,媒体的单数是“中等”而复数是“媒体”,所以试试media。但是,all仍会返回一个数组,无论如何都无法调用media。所以你可能想要:

@campaigns = Campaign.all
@media = Medium.where(:campaign_id => @campaigns.collect(&:id))

或者这个(类似于另一个答案,但你需要展平结果):

Campaign.includes(:media).map(&:media).flatten