我想创建一个多态的友谊/网络系统。
例如
用户可以请求或成为请求者加入多个模型,例如:
- 公司
- 项目
- 团体
- 联系人(朋友)
有些是一对多的,例如,一个用户受雇于一家公司,但一家公司有很多员工。
其他多对多 例如一个用户有很多项目 一个项目有很多用户
使用主动记录来创建关系并不难。中间步骤,让我困惑的请求(邀请)。
经过一番折腾,这就是我想出的。
下面的示例将允许我从配置文件(用户)向多个模型发出请求(这甚至是一个词吗?),包括配置文件模型本身。
这是控制器如何工作的示例。
@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>
这是视图的代码
公司/show.html.erb
<%= @company.name %>
<% render 'requests/form' %>
请求/_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 %>
_型号
配置文件.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
请求.rb
class Request < ActiveRecord::Base
attr_accessible :status
belongs_to :requestable , polymorphic: true
belongs_to :profile
end
公司.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