Как я могу автоматически создать все отношения has_one? - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть следующие модели:

class Post < ApplicationRecord
  has_one: :basic_metric
  has_one: :complex_metric
end


class BasicMetric < ApplicationRecord
  belongs_to :post
end

class ComplexMetric < ApplicationRecord
  belongs_to :post
end

После создания post оба значения basic_metric и complex_metric равны nil:

p = Post.first
p.basic_metric # => nil
p.complex_metric # => nil

И посколькуиз того, как работает мое приложение, BasicMetricsController и ComplexMetricsController имеют только метод обновления. Поэтому я хотел бы знать, есть ли способ создать их, как только будет создан post.

Ответы [ 2 ]

3 голосов
/ 01 ноября 2019

Один из наиболее распространенных способов сделать это - использовать обратные вызовы ActiveRecord

class Post
  after_create :create_metrics

  private

  def create_metrics
    # methods created by has_one, suggested in the comments
    create_basic_metric(additional_attrs)
    create_complex_metric(additional_attrs)
  end
end

Другой вариант, который у вас есть, - переписать метод, созданный has_one, то есть:

class Post
  has_one: :basic_metric
  has_one: :complex_metric

  def basic_metric
    super || create_basic_metric(additional_attrs)
  end

  def complex_metric
    super || create_complex_metric(additional_attrs)
  end
end

Таким образом, они не будут создаваться автоматически с какой-либо новой публикацией, а будут создаваться по требованию при вызове метода.

0 голосов
/ 01 ноября 2019

Можете ли вы попробовать это,

post = Post.first
post.build_basic_metric
post.build_complex_metric

Это поможет вам построить / создать объект ассоциации has_one, если запись не сохранена по умолчанию, используйте post.save в конце.

Если вам нужно это в модальном режиме, вы можете использовать вот так:

class Post
  after_create :build_association_object

  private

  def create_metrics
    self.build_basic_metric 
    self.build_complex_metric
    # save # (optional)
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...