Rails:如何创建多态关系/友谊模型

时间:2012-06-28 06:57:29

标签: ruby-on-rails activerecord controller social-networking polymorphic-associations

我想创建一个多态友谊/网络系统。

例如

用户可以请求或请求加入多个模型,例如:

  • 公司
  • 项目
  • 联系人(朋友)

有些会是一对多,例如一个公司雇用一个用户,但公司有很多员工。

其他许多人,例如用户有很多项目,项目有很多用户

使用活动记录创建关系并不困难。中间步骤,请求(邀请)令我感到困惑。

在谈到这一点之后,我就想到了。

下面的示例将允许我从一个配置文件(用户)向多个模型发出请求(甚至是一个单词?),包括配置文件模型本身。

这是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

2 个答案:

答案 0 :(得分:1)

我认为用户模型不一定是多态的。

您可以做的是介绍另一个模型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

RequestUser mdoel可以跟踪用户请求的实体,RequestUser模型也会与ProjectCompany建立多态关联,GroupContact型号。

通过这种方式,您始终可以控制哪个用户请求了哪个特定实体,并且还可以简化要执行的计算。

希望这个架构适合你。如果您需要更多帮助,请与我们联系。

修改

您还可以在RequestUser模型中实施状态更改机制,以检查用户发布的请求的状态。

答案 1 :(得分:0)

是的,当然AR支持多态关系,这里是RoR指南的链接。

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