昨天我问了一个关于在Rails中建立模型之间的has_and_belongs_to_many关系的问题。我最终得到了这些关系,但是,我意识到我需要在我的连接表中存储其他信息,这意味着我应该使用has_many与连接模型的关系(我假设?)。
我现在有一个Recipe模型,Ingredient模型和Amounts连接模型。每个食谱都有许多成分,反之亦然。并且配方中的每种成分具有特定单位类型的特定金额。
到目前为止,这是我的设置:
模型/ recipe.rb
class Recipe < ActiveRecord::Base
has_many :amounts
has_many :ingredients, :through => :amounts
end
模型/ ingredient.rb
class Ingredient < ActiveRecord::Base
has_many :amounts
has_many :recipes, :through => :amounts
end
模型/ amounts.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关系时,我可以使用'&lt;&lt;'来推送@ recipe.ingredients并使用recipe_id和ingredient_id自动插入连接表。但是,由于连接表中的其他属性,使用has_many时此方法似乎不起作用。
我将如何创建这些关联?
答案 0 :(得分:0)
您可以直接阅读并分配给recipe.ingredients
,它会自动写入连接表。
但是你不太可能需要它,因为你需要额外的金额信息。对于来自表单的金额,您可能需要使用嵌套属性更新/创建配方。
在数量模型中考虑每种配方成分的唯一性约束。
希望这有帮助
答案 1 :(得分:0)
设置has_many :through
关联是Rails魔术的一部分。您将可以访问has_many
关联为连接表和相关表设置的所有方法。 Rails会自动处理任何关联。
查看Rails指南here。