与单独形式的多态关联

时间:2013-05-16 00:05:49

标签: ruby-on-rails ruby associations polymorphism

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

因此,我需要将用户ID保存在一个表users中,以及其他表中的其他数据,但我希望当用户注册时,他们首先创建帐户,然后根据他们选择的档案类型。

模型/ user.rb

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

模型/ administrator.rb

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

模型/ Editor.rb

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

控制器/ 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

控制器/ 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

视图/编辑/ _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

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

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

问题:

  • 这种关联是否适合我想要完成的事情?
  • 我怎样才能将用户传递给新的编辑器方法?

我现在拥有它的方式不起作用,正如我所说,这种关联似乎并不合适。

感谢您的时间

1 个答案:

答案 0 :(得分:0)

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

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