昨天我问了一个关于在 Rails 中设置模型之间的 has_and_belongs_to_many 关系的问题。我最终得到了这些关系,但是,我意识到我需要在我的连接表中存储额外的信息,这意味着我应该使用 has_many through 与连接模型的关系(我猜?)。
我现在有一个配方模型、成分模型和一个数量连接模型。每个食谱都有许多成分,反之亦然。并且配方中的每种成分在特定的单位类型中都有一定的数量。
到目前为止,这是我的设置:
模型/recipe.rb
class Recipe < ActiveRecord::Base
has_many :amounts
has_many :ingredients, :through => :amounts
end
模型/成分.rb
class Ingredient < ActiveRecord::Base
has_many :amounts
has_many :recipes, :through => :amounts
end
模型/数量.rb
class Amounts < ActiveRecord::Base
belongs_to :recipes
belongs_to :ingredients
end
MySQL 表:
$ mysql > show columns from recipes;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| desc | text | NO | | NULL | |
| image_url | varchar(255) | YES | | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
+------------+--------------+------+-----+---------+----------------+
mysql> show columns from ingredients;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
+------------+--------------+------+-----+---------+----------------+
mysql> show columns from amounts;
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| recipe_id | int(11) | NO | | NULL | |
| ingredient_id | int(11) | NO | | NULL | |
| amount | int(11) | NO | | NULL | |
| units | varchar(255) | NO | | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
+---------------+--------------+------+-----+---------+----------------+
我想我的关系设置正确......我只是不确定如何正确添加到连接模型/表然后访问这些值。例如,我可以调用@recipe.ingredients 并返回所有相关的成分吗?
编辑: 对于我想要做的事情的困惑,我深表歉意。
当我使用 has_and_belongs_to_many 关系时,我可以使用 '<<' 推送到 @recipe.ingredients 并使用 recipe_id 和成分 ID 自动插入连接表。但是,由于连接表中的附加属性,此方法在使用 has_many through 时似乎不起作用。
我将如何创建这些关联?