与单独形式的多态关联

Posted

技术标签:

【中文标题】与单独形式的多态关联【英文标题】:polymorphic association with separate forms 【发布时间】:2013-05-16 00:05:48 【问题描述】:

我有一个模型,User,然后是另外 2 个模型:EditorAdministrator 通过多态关联与用户模型相关联,所以我想要有 2 种类型的用户,他们会有不同的字段,但我需要它们共享某些功能(例如在两者之间发送消息)。

因此,我需要将用户 ID 保存在一个表中,users,并将其他数据保存在其他表中,但我希望当用户注册时,他们首先创建帐户,然后根据类型创建个人资料他们确实选择了个人资料。

model/user.rb

class User < ActiveRecord::Base
belongs_to :profilable, :polymorphic => true
end

model/administrator.rb

class Administrator < ActiveRecord::Base
    has_one :user, :as => :profilable
end

model/Editor.rb

class Editor < ActiveRecord::Base
attr_accessor :iduser
has_one :user, :as => :profilable
end

controllers/user.rb

def create
@user = User.new(params[:user])

respond_to do |format|


  if @user.save
    if params[:tipo] == "editor"
     format.html redirect_to new_editor_path(:iduser => @user.id)
   else
     format.html  redirect_to new_administrator_path(@user) 
    end
  #  format.json  render json: @user, status: :created, location: @user 
  else
    format.html  render action: "new" 
    format.json  render json: @user.errors, status: :unprocessable_entity 
  end
 end
end

controllers/editor.rb

def new

 @editor = Editor.new
 @editor.iduser = params[:iduser]
 respond_to do |format|
   format.html # new.html.erb
   format.json  render json: @editor 
  end
end

def create
 id = params[:iduser]
 @user = User.find(id)
 @editor = Editor.new(params[:editor])
 @editor.user = @user
 respond_to do |format|
  if @editor.save
   format.html  redirect_to @editor, notice: 'Editor was successfully created.' 
   format.json  render json: @editor, status: :created, location: @editor 
  else
   format.html  render action: "new" 
   format.json  render json: @editor.errors, status: :unprocessable_entity 
  end
 end
end

views/editor/_form.html.erb

<div class="field">
 <%= f.label :bio %><br />
 <%= f.text_area :bio %>
 <%= f.hidden_field :iduser%>
</div>

routes.rb

Orbit::Application.routes.draw do
 resources :administrators
 resources :editors
 resources :users

当有人创建新用户时,他们必须使用单选按钮来选择“编辑器”或“管理员”,然后使用该参数,代码将创建编辑器或管理员配置文件。

我不确定我是否有关联权限,因为它应该是“用户有个人资料(编辑/管理员)”,但在这种情况下是“个人资料(管理员/编辑)有一个用户”。

问题:

关联是否适合我想要完成的任务? 如何将用户传递给新的编辑器方法?

我现在拥有它的方式不起作用,正如我所说,该关联似乎不正确。

感谢您的时间

【问题讨论】:

谢谢@SimonMcKenzie :) 【参考方案1】:

尝试交换关联, 用户将拥有一个管理员配置文件,而管理员配置文件将属于该用户。

Administrator(:user_id, :other_attributes)
Editor(:user_id, :other_attributes)

这样,

class Administrator < ActiveRecord::Base
 belongs_to :user
end

class Editor < ActiveRecord::Base
 belongs_to :user
end

class User < ActiveRecord::Base
 has_one :administrator
 has_one :editor
end

【讨论】:

谢谢,我会尽快尝试,但为了确定,Administrator(:user_id, :other_attributes),那行到底是做什么的?我想我必须把它放在控制器中,但不确定,你能解释一下关于那段代码的更多信息吗? 通过 other_attributes,我的意思是您的管理员模型将具有的剩余属性。我刚刚向您展示了模型属性。对不起,应该更清楚。 最重要的是感谢您的宝贵时间,感谢您的帮助。我现在看到了,好吧,我不得不问因为什么时候是关于 rails 的,有些方法只是被称为它们所做的事情,当然我的实际关联不是应该的,我找到了一种方法来传递我需要的参数,使用:format.html redirect_to new_editor_path(:iduser =&gt; @user.id) 并在编辑器模型上使用attr_accessor :iduser,到目前为止我没有更改关联因为我想先修复传递参数的事情,因为我只是半途而废。不喜欢半途而废,我想这是一种自豪感。

以上是关于与单独形式的多态关联的主要内容,如果未能解决你的问题,请参考以下文章

渴望加载与 Kaminara 分页的多态关联

与多态表的一对多条件关联:Rails

详细说明:方法重载是静态/编译时绑定,但不是多态性。将静态绑定与多态性相关联是不是正确?

rails中的多态关联

具有多态实体的子类关联表的 SQLAlchemy 设置

Rails 关联帮助 - 我是不是使用多态关联?