1

多形の友情/ネットワークシステムを作りたいです。

例えば

ユーザーは、次のような複数のモデルに参加するように要求するか、要求者になることができます。

  • 会社
  • 計画
  • グループ
  • 連絡先(友達)

1対多の場合もあります。たとえば、ユーザーは1つの会社に雇用されていますが、会社には多くの従業員がいます。

その他の多対多。たとえば、ユーザーには多くのプロジェクトがあります。プロジェクトには多くのユーザーがいます。

アクティブな記録を使用して関係を作成することは難しくありません。真ん中のステップ、私を困惑させている要求(招待)。

少しいじった後、これが私が思いついたものです。

以下の例では、プロファイル(ユーザー)から複数のモデル(プロファイルモデル自体を含む)にポリモフィカルにリクエストを送信できます(それは単語ですか?)。

これは、コントローラーがどのように機能するかのサンプルです。

@company = Company.find(params[:id])
@request = @company.requests.create!(status: "pending").build_profile 
@request.profile = current_user

@companyをより動的にするには、たとえば、プロジェクトへの参加を要求しているプロファイル(ユーザー)または別のプロファイル(ユーザー)との友達を要求しているプロファイル(ユーザー)がある場合はどうすればよいですか?

だから私は私のコントローラーの次のコードで私が思うこの小さな問題を解決しました。

requests_controller.rb

class RequestsController < ApplicationController
  before_filter :load_requestable

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

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

private

def load_resquestable
    resource, id = requests.path.split('/')[1, 2]
    @requestable = resource.singularize.classify.constantize.find(id)
end 

[こだわり]ビューでリクエストボタンを表示しようとすると、次のエラーが発生します

undefined method `requests_path' for #<#<Class:0x007fe8b26667f8>:0x007fe8b26f40d0> 

抽出されたソース(1行目あたり):

1: <%= form_for [@requestsable, @request] do |f| %>
2:   <div class="field">
3:     <%= f.text_area :content, rows: 8 %>
4:   </div> 

ビューのコードは次のとおりです

Companies / show.html.erb

<%= @company.name %>
<% render 'requests/form' %>

requests / _form.html.erb

<%= form_for [@requestsable, @request] do |f| %>
  <div class="field">
    <%= f.text_area :content, rows: 8 %>
  </div>
  <div class="actions">
   <%= f.submit %>
  </div>
<% end %>

_モデル

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

request.rb

class Request < ActiveRecord::Base

   attr_accessible :status
   belongs_to :requestable , polymorphic: true
   belongs_to :profile

end

company.rb

class Company < ActiveRecord::Base
   has_many :employees, 
    :foreign_key => 'company_id', 
    :class_name => "Profile"

   has_many :requests, as: :requestable


  attr_accessible :name
  validates :name,  presence: true, length: { maximum: 50 }, uniqueness: true

end
4

2 に答える 2

1

多態的でなければならないのは User モデルではないと思います。

あなたにできることは、 から までの 1 対 5 の関連付けとなる別のモデルを紹介することUserRequestです。UserUserRequest

次に、次のことができます。

class User < ActiveRecord::Base
  has_many :user_requests
  has_many :project_users
  has_many :projects, :through => :project_users
  has_many :group_users
  has_many :groups, :through => group_users
  has_many :contact_users
  has_many :contacts, :through => :contact_users
  belongs_to :company
end

また、RequestUsermdoel は、ユーザーがどのエンティティを要求したかを追跡できます。また、モデルは、 、、およびモデルRequestUserとのポリモーフィックな関連付けを持ちます。ProjectCompanyGroupContact

このようにして、どのユーザーがどの特定のエンティティに対して要求を持っているかを常に制御でき、実行される計算も容易になります。

このアーキテクチャがうまくいくことを願っています。さらにサポートが必要な場合はお知らせください。

編集:

モデルに状態変更メカニズムを実装しRequestUserて、ユーザーが投稿したリクエストのステータスを確認することもできます。

于 2012-06-28T07:35:29.843 に答える
-1

はい、もちろん AR はポリモーフィックな関係をサポートしています。RoR ガイドへのリンクはこちらです。

http://guides.rubyonrails.org/association_basics.html

于 2012-06-28T07:35:01.513 に答える