0

我有兩個模型彼此具有一定的關係。我的模型關係不像預期的那樣工作

我有一個膳食模型和一個*餐*食物*模型。

在這裏,他們是因爲我讓他們此刻寫着:

class MealFood < Food 
    has_and_belongs_to_many :meal 
end 

class Meal < ActiveRecord::Base 
    belongs_to :user 
    has_many :meal_food 

    attr_accessible :user_id 
end 

每當我試圖創建一個meal_food吃飯,像這樣:

meal.meal_food.create() 

我得到這個錯誤:

ActiveRecord::UnknownAttributeError: unknown attribute: meal_id 

如果我通過這樣的事情:

meal.meal_food.create(meal_id:meal.id) 

我得到這個錯誤:

ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: meal_id 

我想到的是有一個meal_food創建,並將它與爲其創建了一頓相關。雖然,它可以有很多餐。所以我希望如果我查詢meal.meal_food,它會返回所有與該餐相關的食物。事實上,Rails要求我提供一次meal_id,這讓我認爲Rails認爲這是一對一的關係,而關係表並未創建。


我創建了一個聯接表。下面是它的模式:

create_table "meals_meal_food", :force => true do |t| 
    t.integer "meal_id" 
    t.integer "meal_food_id" 
end 

我也改變了我一頓模型像這樣:

class Meal < ActiveRecord::Base 
    belongs_to :user 
    has_and_belongs_to_many :meal_foods 

attr_accessible :user_id 
end  

錯誤,現在是:

meal.meal_food.create() 

>> NoMethodError: undefined method `meal_food' for #<Meal id: 1, user_id: 1> 
+1

它看起來像你的避風港現在還沒有更新你的模型,直到你這麼做纔會起作用。另外,Rails是通過配置來實現的,這意味着如果你想讓Rails「魔術」工作,你必須使用正確的約定。例如,你的連接表應該是'meals_meal_foods',你應該在最後使用'meal.meal_foods.create' - 複數。 – 2013-04-04 03:18:30

+0

謝謝。複數部分是現貨。在添加's'後,我遇到了一個不同的錯誤。 :)我現在必須運行表名更改的遷移。讓我們看看發生了什麼。 – 2013-04-04 03:21:58

+0

它實際上應該是rename_table:meal_foods_meals,但你基本上幫助我得到正確的想法!謝謝! – 2013-04-04 03:30:21

回答

1

據我知道你has_and_belongs_to_many協會是錯誤的,你需要把它在這兩種模式:

class MealFood < Food 
    has_and_belongs_to_many :meals 
end 

class Meal < ActiveRecord::Base 
    has_and_belongs_to_many :meal_foods 
end 

此外,模型需要使用複數have a look at this guide

然後,您需要創建一個帶有meal_idmeal_food_id整數列的meal_foods_meals連接表。

然後訪問您的關聯,你必須使用複數形式:

meal.meal_foods.create 

如果你想使用has_many/belongs_to INSEAD你仍然需要變複數的has_many

class MealFood < Food 
    belongs_to :meal 
end 

class Meal < ActiveRecord::Base 
    has_many :meal_foods 
end 
+0

alrighty。我已經更新了我的問題,以包括解決答案的第一部分。第二部分不適合我,因爲餐食應該屬於多餐而不只是一餐。感謝您的回答! – 2013-04-04 03:10:56

+0

答案在評論下面的問題,除非mind.blank編輯這個答案。再次感謝! – 2013-04-04 03:31:16

-1

只要改變你的模型此:

class Meal < ActiveRecord::Base 
    belongs_to :user 
    has_many :meal_food 

    attr_accessible :user_id, :meal_id 
end 

注意:完全重複的問題here

+0

這給出了這個錯誤「ActiveModel :: MassAssignmentSecurity :: Error:Can not mass-assign protected attributes:meal_id」 – 2013-04-04 02:04:30

相關問題