1

外部キーを介してレールオブジェクトをリンクする最良の方法は何ですか? これが私の例です。開業医はタイムカードを持っています (1 日あたりの勤務時間を集計します)。これを示すために、開業医のIDを予約に入れたい:

routes.rb から

  resources :locations do
    resources :practitioners, only: [:new, :create]
  end

  resources :practitioners, except: [:new, :create] do
    resources :timecards, except: :delete
    resources :appointments
  end

timecard.rb - timecard.practitioner_id を強制的に 3 に設定したことがわかりますが、これは力ずくのテスト作業でした。

class Timecard < ActiveRecord::Base
  belongs_to :practitioner
 attr_protected :id

  before_save :set_practitioner_id

  def set_practitioner_id
    if self.practitioner_id.blank?
      self.practitioner_id = 3
    end
  end
end

そして私のコントローラーから...

def create
    @practitioner = Practitioner.find(params[:practitioner_id])
    @timecard = Timecard.create(params[:timecard])


    respond_to do |format|
      if @timecard.save
        format.html { redirect_to @practitioner, notice: 'Timecard was successfully created.' }
        format.json { render json: @timecard, status: :created, location: @timecard }
      else
        format.html { render action: "new" }
        format.json { render json: @timecard.errors, status: :unprocessable_entity }
      end
    end
  end

プラクティショナー ID = 3 のパラメーター (これを使用したい) を確認できますが、コードでアクセスする方法がわかりません。

Parameters:

{"utf8"=>"✓",
 "authenticity_token"=>"DIp4R31McXnBNP4NB06KDTzV+8lLcWvxbq1w9J+Z1+M=",
 "timecard"=>{
   "hours_worked"=>"2",
   "activity_date(1i)"=>"2013",
   "activity_date(2i)"=>"3",
   "activity_date(3i)"=>"20",
   "practitioner_id"=>"",
   "location_id"=>"1"
 },
 "commit"=>"Create Timecard",
 "practitioner_id"=>"3"   <== this is what I want to use
}
4

2 に答える 2

1

あなたの質問が理解できれば@timecard.practitioner = @practitioner、コントローラーにタイムカードを保存する前に簡単に設定できます。「関連付けオブジェクトを割り当て、主キーを抽出し、外部キーとして設定する」メソッドをbelongs_to 提供するため、それが可能になります。practioner=

于 2013-03-28T01:02:02.567 に答える
0

開業医は多くのタイムカードを持っていると想定しているので、次のようなことができるはずです

# practitioner.rb
has_many :timecards

# controller
@practitioner = Practitioner.find(params[:practitioner_id])
@timecard = @practitioner.timecards.build(params[:timecard])

アソシエーションを設定すると、外部キーが設定されます。

于 2013-03-28T01:03:03.100 に答える