0

我有两个模型彼此有一定的关系。

我有一个用餐模型和一个 *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 的事实使我认为 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>
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

如果你想使用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 回答
-1

只需将您的模型更改为:

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

  attr_accessible :user_id, :meal_id
end

注意:此处完全重复的问题。

于 2013-04-04T01:59:22.143 回答