1. ホーム
  2. ruby-on-rails

Rails - ベストプラクティス。依存するhas_oneリレーションの作成方法

2023-08-27 09:30:34

質問

has_oneリレーションを作成するためのベストプラクティスは何ですか?

例えば、私がユーザーモデルを持っていて、それがプロファイルを持たなければならないとしたら...

どうすれば実現できるでしょうか?

ひとつの解決策になります。

# user.rb
class User << ActiveRecord::Base
  after_create :set_default_association

  def set_default_association
    self.create_profile
  end
end

でも、これだとあまりきれいじゃないような...。 何か提案はありますか?

どのように解決するのですか?

has_oneリレーションを作成するベストプラクティスは、ActiveRecordコールバックの before_create よりも after_create . または、さらに早いコールバックを使用し、子プロセスが自身の検証ステップを通過しない問題に対処します (もしあれば)。

なぜなら

  • をうまくコーディングすれば、子レコードのバリデーションが失敗したときに、ユーザーに表示する機会があります。
  • ARは、親レコードを保存した後(作成時)、自動的に子レコードの外部キーに入力されます。AR はその後、親レコードを作成する一部として子レコードを保存します。

どうやるか。

# in your User model...
has_one :profile
before_create :build_default_profile

private
def build_default_profile
  # build default profile instance. Will use default params.
  # The foreign key to the owning User model is set automatically
  build_profile
  true # Always return true in callbacks as the normal 'continue' state
       # Assumes that the default_profile can **always** be created.
       # or
       # Check the validation of the profile. If it is not valid, then
       # return false from the callback. Best to use a before_validation 
       # if doing this. View code should check the errors of the child.
       # Or add the child's errors to the User model's error array of the :base
       # error item
end