動的変数名/オブジェクトを作成するにはどうすればよいですか?
リクエストを送信し、承認時にモデルを結合するためのポリモーフィック モデルがあります。たとえば、ユーザーは会社、プロジェクト、またはグループなどに参加できます。
だから私はさまざまなモデルに属しているプロファイルモデルを持っていますが、リクエストが受け入れられたら関係を構築したいだけです。
profile.rb
class Profile < ActiveRecord::Base
belongs_to :user
belongs_to :company
has_many :requests
has_many :requested, as: :requestable
attr_accessible :first_name, :last_name
validates :first_name, presence: true
validates :last_name, presence: true
end
コントローラーが処理しているモデルに基づいてアクションを適用できるようにする必要があります。
@profile.@belongs_to が @profile.company と同じになることを期待していましたが、この場合はゼロになります。そこから @profile.@belongs_to = @requestable
プロファイルは常にモデルに所属するため、参加する @belongs_to は常に小文字のモデル名になります。
これを理解しようと、フラッシュ メッセージに投稿されたオブジェクトの内容をいじっています。
requests_controller.rb
class RequestsController < ApplicationController
before_filter :load_requestable
def accept
@request = Request.find(params[:id])
@profile = Profile.find(@request.profile.id)
redirect_to [@requestable, :requests], notice: "#{@profile.@belongs_to} #{@request.profile.first_name} #{@request.profile.last_name} id: #{@request.profile.id} wants to join #{@requestable.name} id: #{@requestable.id}"
end
private
def load_requestable
klass = [Company, Profile].detect { |c| params["#{c.name.underscore}_id"]}
@requestable = klass.find(params["#{klass.name.underscore}_id"])
@belongs_to = klass.to_s.downcase
end
end
私はコンソールで次のようなことをしてみました:
profile = Profile.first
profile.company = Company.first
これにより、保存できるオブジェクトに結合が作成されます。