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
,这将是一个可以从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
模型中实现状态更改机制来检查用户发布的请求的状态。
【讨论】:
我也有类似的想法,但我觉得重复使用 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:如何创建多态关系/友谊模型的主要内容,如果未能解决你的问题,请参考以下文章