0

after_create コールバックを使用して、結合モデルを介して User に Program_id を割り当て、同じ結合モデルの 3 つの追加パラメーターに初期値を割り当てようとしています。

program_id の割り当ては正常に機能しますが、追加のパラメーターを追加する方法がわかりません。

class User < ActiveRecord::Base

after_create :assign_user_program, :add_initial_programs

  def assign_user_program
    self.programs = Program.for_user(self)
  end

class Program < ActiveRecord:Base

  def self.for_user(user)
    where(:goal_id => user.goal_id, :experience_id => user.experience_level_id, :gender => user.gender) 
  end

after_create で別のメソッドを作成して他の 3 つのパラメーターを割り当てようとしましたが、結合モデルに 3 つのパラメーターが割り当てられた別のレコードが作成され、program_id はありません。

def add_initial_programs
   self.user_programs.create(:cycle_order => 1, :group_order => 1, :workout_order => 1)
end

作成したばかりのレコードを簡単に更新する方法についてのアイデアはありますか?

編集:

明確にするために、図に示すように、結合テーブルに、program_id、user_id、group_order、cycle_order、workout_order を使用して 1 つのレコードを作成しようとしています。

ここに画像の説明を入力

何が起こっているかというと、2 つのレコードを取得しています。下の図を参照してください。

ここに画像の説明を入力

4

2 に答える 2

0

したがって、ここでの答えは実際には非常に簡単でした。次のように、すべてのロジックを 1 つのメソッドに入れる必要がありました。

def add_initial_program
    prog_id = Program.for_user(self).first.id
    self.user_programs.build( :cycle_order => 1, :group_order => 1, :workout_order => 1, :program_id => prog_id)
  end

これにより、ユーザーにプログラムを提供し、必要な他の値を割り当てるという望ましい結果が得られました。

于 2013-06-28T15:50:21.053 に答える
0

データベースに永続化される前に、追加の属性がモデルに設定されるようにするbefore_create代わりに、おそらくコールバックを実行する必要があります。after_createこれを行うと、1 つのクエリではなく 2 つのクエリ ( oneと one ) をafter_create送信することになります。CREATEUPDATECREATE

class User < ActiveRecord::Base
  before_create :assign_user_program, :add_initial_programs

  protected

  def assign_user_program
    self.programs = Program.for_user(self)
  end

  def add_initial_programs
    self.user_programs.build(:cycle_order => 1, :group_order => 1, :workout_order => 1)
  end
end

本当に で実行したい場合は、ユーザー モデルでまたはafter_createを呼び出して、実際に属性の変更をデータベースに永続化する必要があります。savesave!

于 2013-05-24T05:04:17.597 に答える