2012-12-13 90 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