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

Posted

技术标签:

【中文标题】Rails:如何创建多态关系/友谊模型【英文标题】:Rails: How to create polymorphic relationship/friendship model 【发布时间】:2012-06-28 06:57:29 【问题描述】:

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

例如

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

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

有些是一对多的,例如用户受雇于一家公司,但一家公司有很多员工。

其他多对多,例如一个用户有很多项目一个项目有很多用户

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

经过一番折腾,我想到了这个。

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

这是控制器如何工作的示例。

@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 

[sticking point] 现在我正在尝试让我的视图中的请求按钮发生并收到以下错误

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 %>

_模型

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

公司.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

【问题讨论】:

【参考方案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 模型还将与ProjectCompanyGroupContact 具有多态关联模型。

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

希望这种架构适合您。如果您需要更多帮助,请告诉我。

编辑:

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

【讨论】:

我也有类似的想法,但我觉得重复使用 model_users 的事实不是很干。 您可以使用has_and_belongs_to_many 关联删除这些模型。但我个人觉得两者之间的连接模型(has_many through)关联可以让您更好地控制两个关联模型。您可以参考此链接***.com/questions/2780798/…了解更多详情【参考方案2】:

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

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

【讨论】:

我认为 OP 知道 AR 中存在多态关系。链接到特定部分而不是“这里是 AR 关联”会很好,它表明此页面可能无法帮助 OP 解决他们的特定问题

以上是关于Rails:如何创建多态关系/友谊模型的主要内容,如果未能解决你的问题,请参考以下文章

iOS Core Data:为 Rails 多态关联设置关系的方法

具有多态模型的 Rails 范围

友谊关系的最佳模型(在 Django 中)

HABTM 多态关系

rails 4:多态设置基类类型而不是继承

Rails在使用多态关联时组合和排序ActiveRecord关系