0

互いに特定の関係を持つ 2 つのモデルがあります。

私は食事モデルと *meal_food* モデルを持っています。

ここにそれらは私が現時点で書いているとおりです:

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を要求しているという事実は、これが1対1の関係であり、関係テーブルが作成されていないとRailsが考えていると私に思わせます。


Join テーブルを作成しました。そのスキーマは次のとおりです。

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>
4

2 に答える 2

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

また、モデルは複数形にする必要があります。このガイドをご覧ください。

次に、整数列を含むmeal_foods_meals結合テーブルを作成する必要があります。meal_idmeal_food_id

関連付けにアクセスするには、複数形を使用する必要があります。

meal.meal_foods.create

use has_many/ belongs_toinsead が必要な場合でも、複数形にする必要がありますhas_many

class MealFood < Food
  belongs_to :meal
end  

class Meal < ActiveRecord::Base
  has_many :meal_foods
end
于 2013-04-04T01:59:46.113 に答える