0

私のアプリには、ユーザー、学校 (グループ)、およびコースがあります。これら3つのモデルのいずれかが他のモデルにリクエストを送信し、リクエスト受信者にリクエストを受け入れるか拒否するかを選択できるモデルを設定しようとしています。私が考えていたのは、ポリモーフィックからポリモーフィックへの関連付けを設定して、Rails が request_sender とレシーバーの ID とタイプを識別できるようにすることでした。私の最初の質問は、この機能を実現するためにポリゴンからポリゴンへのテーブルをセットアップすることは理にかなっていますか、それとも別のことを試みるべきでしょうか? poly to poly テーブルが理にかなっている場合は、現在のコントローラーと db テーブルを含めました。

リクエスト用に設定したデータベース テーブルは次のとおりです。

class CreateRequests < ActiveRecord::Migration
  def change
    create_table :requests do |t|

      t.belongs_to :request_sender, polymorphic: true
      t.belongs_to :requestable , polymorphic: true

      t.timestamps
    end

    add_index :requests, [:request_sender_id, :request_sender_type]
    add_index :requests, [:requestable_id, :requestable_type]
  end
end

これは私のリクエストコントローラーです。私が抱えている問題は、リクエストの送信者と受信者の両方のクラスを決定するメソッドを定義することです:

def new
  @request = @requestable.requests.new
end

def create
  @request = @requestable.requests.new(params[:request])
  if @request.save
    redirect_to @requestable, notice: "requested."
  else
    render :new
  end
end

private
def load_requestable
  klass = [School, User, Course].detect { |c| params["#{c.name.underscore}_id"] }
  @requestable = klass.find(params["#{klass.name.underscore}_id"])
end

私はプログラミングとレールの両方に慣れていないため、ヘルプやガイダンスは大歓迎です。私が何をしているのかほとんどわかりません。

4

1 に答える 1

0

もちろん、これが機能しない理由はありません。

メッセージを作成するときに必要なのは、作成者と受信者の class_name と ID を送信することです。フォームが次のように送信するとします。

  • レシーバークラス
  • receiver_id
  • 送信者クラス
  • 送信者 ID

次に、 MessagesController で

def create
  message = Message.new.tap do |m|
    m.sender   = params[:sender_class].classify.constantize.find(params[:sender_id])
    m.receiver = params[:receiver_class].classify.constantize.find(params[:receiver_id])
    m.message  = params[:message]
  end
  if message.save
    redirect_to root_path, notice: "Awesome!"
  else
    render :new
  end
end
于 2012-06-13T03:54:48.137 に答える