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> 

这是视图的代码

公司/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
4

2 回答 2

1

我认为不是用户模型必须是多态的。

您可以做的是引入另一种模型UserRequest,该模型将是一个 to may 关联 from Userto 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

mdoelRequestUser可以跟踪用户请求的实体,模型也将与 、 和模型具有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 回答