我有以下型号:
class Post < ApplicationRecord
has_many :metrics
end
class Metric < ApplicationRecord
belongs_to :post
end
我想知道为什么post实例中没有create_metrics
方法。如果关系是:
class Post < ApplicationRecord
has_one :metric
end
class Metric < ApplicationRecord
belongs_to :post
end
帖子实例中将有一个方法create_metric
。
答案 0 :(得分:2)
此处指定了一个collection.create方法:https://guides.rubyonrails.org/association_basics.html#methods-added-by-has-many-collection-create-attributes
在这种情况下,您可以致电:
@metric.posts.create
并传递带有所需数据的对象数组。
答案 1 :(得分:1)
不确定为什么没有便捷方法,但是肯定有post.metrics.create(...)
方法。这些动态方法大多数都在集合本身上,而不是原始模型上。有关更多详细信息,请参见official Rails ActiveRecord Associations Guide。
答案 2 :(得分:1)
如果您将问题抛到最后,您会发现对于belongs_to
和has_one
,您拥有build_other
和create_other
方法,因为默认情况下关联为nil。
因此,如果您致电thing.other.create
,那么您将nil致电.create
。不好。尽管您可以通过创建某种代理对象来解决它,但该代理对象会破坏依赖于它的代码为nil的代码。
has_many
和has_and_belongs_to_many
不会出现此问题,因为空关联是AssociationProxy对象。您可以将其视为一个空数组。甚至空数组都有方法。
调用foo.bars.new
或foo.bars.create
比某些元编程方法自然得多。而且更容易找到正确的文档。