多形の友情/ネットワークシステムを作りたいです。
例えば
ユーザーは、次のような複数のモデルに参加するように要求するか、要求者になることができます。
- 会社
- 計画
- グループ
- 連絡先(友達)
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