我想创建一个多态友谊/网络系统。
例如
用户可以请求或请求加入多个模型,例如:
有些会是一对多,例如一个公司雇用一个用户,但公司有很多员工。
其他许多人,例如用户有很多项目,项目有很多用户
使用活动记录创建关系并不困难。中间步骤,请求(邀请)令我感到困惑。
在谈到这一点之后,我就想到了。
下面的示例将允许我从一个配置文件(用户)向多个模型发出请求(甚至是一个单词?),包括配置文件模型本身。
这是Controller如何工作的示例。
@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' %>
请求/ _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
答案 0 :(得分:1)
我认为用户模型不一定是多态的。
您可以做的是介绍另一个模型UserRequest
,该模型可以是User
到UserRequest
之间的关联模型。
然后您可以执行以下操作:
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
RequestUser
mdoel可以跟踪用户请求的实体,RequestUser
模型也会与Project
,Company
建立多态关联,Group
和Contact
型号。
通过这种方式,您始终可以控制哪个用户请求了哪个特定实体,并且还可以简化要执行的计算。
希望这个架构适合你。如果您需要更多帮助,请与我们联系。
修改强>
您还可以在RequestUser
模型中实施状态更改机制,以检查用户发布的请求的状态。
答案 1 :(得分:0)
是的,当然AR支持多态关系,这里是RoR指南的链接。