2012-12-13 116 views
3

我期待更好地理解活动模型/记录关系以及如何根据属性所在的位置(模型)以及我调用它们的位置来调用属性。因此,例如,我可以从配方控制器内访问属性dish_name像这样从不同的关联模型导轨访问属性3

def all_recipes 
@recipes = Recipe.all 
end 

在视图

<% @recipes.each do |r| %> 
<%= r.dish_name %> 
<% end %> 

现在说,我想从我的控制器称为worldrecipes,我中访问配方属性刚刚写了一个方法,将所有食谱返回到同一个国家。一个国家有许多食谱的关系

所以我的方法是

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

我控制器

@worldrecipes = Country.where(:name => params[:name]) 

,并查看

<% @worldrecipes.each do |r| %> 
<%= r.name %> 
<% end %> 

所以访问该国的name属性是很容易的它在国家模式和那里我的查询结果是从(我认为)返回...我的问题是如何访问从我的食谱模型dish_name属性是链接到国家名称

希望是有道理的,没有任何人有如何来解决这一问题或这个

感谢一些金科玉律指南你

+0

'@worldrecipes = Country.where(:name => params [:name])'给你的国家记录的名称是'params [:name]'还是该国家的食谱数组? –

+0

它给我的记录名称为params [:name],因为在我看来,我在页面上打印出“意大利”一词,这不完全正确,因为有2条记录与意大利,只有一条正在显示 – Richlewis

回答

3

对于初学者来说,你要确保你有你的模型的关联设置:

country.rb

class Country < ActiveRecord::Base 
    has_many :recipes 
end 

recipe.rb

class Recipe < ActiveRecord::Base 
    belongs_to :country 
end 

如果您还没有完成,请通过运行以下命令将foreign_key属性添加到您的配方模型中迁移:

rails g migration add_country_id_to_recipe country_id:integer 

既然您的协会已经到位,您可以轻松查询各个国家的食谱。在你的控制器:

@worldrecipes = Country.where(:name => params[:name]) 

然后在您的视图:

<% @worldrecipes.each do |c| %> 
    <% c.recipes.each do |r| %> 
    <%= r.dish_name %> 
    <% end %> 
<% end %> 

在问候 '金科玉律' 我强烈建议你看看Association Basics。这是您可以对关联做什么的概述的前提。

+0

从数据库中拉出国家时,不需要使用包含。它可能会浪费记忆,通常只有一个国家,如果你知道我在说什么。 –

+0

好吧,所以这是一个嵌套块,现在我输出混淆了,它的所有属性都打印出了我的所有食谱,我的关联就像你说的那样,他们已经像从头开始那样设置 – Richlewis

+0

remove' '从视图中的第2行开始 –

4

我想你需要的是:

@country=Country.where(:name=>params[:name]).first 
@[email protected] 

并在视图:

<% @worldrecipes.each do |r| %> 
    <%= r.dish_name %> 
<% end %> 

这将打印该国与名称由params[:name]

编辑提供的食谱菜名: 好让我清楚这件事对你:)

您的模型关系是建立使得每个国家都有很多食谱。即一个国家有很多配方。

所以你必须,

has_many :recipes 

在country.rb和

belongs_to :country 

在recipe.rb现在

当你要访问所有属于一个国家的食谱,有什么你要做的是,你叫country_record.recipes(country_record是你需要的国家记录的对象)。

当你骂, Country.where(:名称=> PARAMS [:名字]) 什么你实际上得到的是代表该国本身和该国没有配方活动记录的对象,这就是为什么意大利被打印。

希望这对你有所帮助。

+0

现在我得到未定义的方法'食谱'为# Richlewis

+0

检查您的模型文件。你创造了关系吗? –

+0

关系如你所说 – Richlewis