为什么has_many关系不存在create_ *方法?

时间:2019-11-13 19:20:28

标签: ruby-on-rails

我有以下型号:

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

3 个答案:

答案 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_tohas_one,您拥有build_othercreate_other方法,因为默认情况下关联为nil。

因此,如果您致电thing.other.create,那么您将nil致电.create。不好。尽管您可以通过创建某种代理对象来解决它,但该代理对象会破坏依赖于它的代码为nil的代码。

has_manyhas_and_belongs_to_many不会出现此问题,因为空关联是AssociationProxy对象。您可以将其视为一个空数组。甚至空数组都有方法。

调用foo.bars.newfoo.bars.create比某些元编程方法自然得多。而且更容易找到正确的文档。