我有兩個模型彼此具有一定的關係。我的模型關係不像預期的那樣工作
我有一個膳食模型和一個*餐*食物*模型。
在這裏,他們是因爲我讓他們此刻寫着:
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>
它看起來像你的避風港現在還沒有更新你的模型,直到你這麼做纔會起作用。另外,Rails是通過配置來實現的,這意味着如果你想讓Rails「魔術」工作,你必須使用正確的約定。例如,你的連接表應該是'meals_meal_foods',你應該在最後使用'meal.meal_foods.create' - 複數。 – 2013-04-04 03:18:30
謝謝。複數部分是現貨。在添加's'後,我遇到了一個不同的錯誤。 :)我現在必須運行表名更改的遷移。讓我們看看發生了什麼。 – 2013-04-04 03:21:58
它實際上應該是rename_table:meal_foods_meals,但你基本上幫助我得到正確的想法!謝謝! – 2013-04-04 03:30:21