1

Account {id, name, address, email, password, etc ...}というユーザー モデルがあり、そのユーザーが他のユーザーを作成および管理できるようにしたいと考えています。ユーザーと他の管理対象ユーザーとの関係を追跡するために、関係モデル {manager_id、care_id、関係など ...} を作成しました。基本的に、ユーザーhas_many relationships through: :relationships, source: "care_id". 私が理解していることから、関係を構築する前に、新しいユーザー ID を取得するために、最初に新しいユーザーを作成する必要があります。通常のユーザーは、サインアップ時に電子メール、パスワードなどの検証が必要になります...ただし、管理対象ユーザーの場合、必要なのは名前だけであり、後で他のすべてを編集することができます.

そのような機能を実装するための最良/正しい方法は何ですか。新しいコントローラーが必要ですか? または、新しいアクションをデフォルトのユーザー コントローラーに追加することはできますか? User モデルの通常の検証を行わずに新しいユーザーを作成するにはどうすればよいですか (名前、電子メール、パスワードを空にすることはできません、特定の長さでなければならないなど...)。正しいユーザー ID を使用して関係を自動的に作成するにはどうすればよいですか。あなたの助け、および/または私を正しい方向に向けてくれてありがとう。

アイデアは次のとおりです。ユーザーはサインアップして自分のアカウントを管理できます。その後、彼は「ケア」アカウントを作成できます。これは、基本的に開始するために必要なのは名前だけであり、子アカウントはログインに電子メール/パスワードを使用しないため、他の検証は必要ありません. 子アカウントが後でアクセスしたい場合、親アカウントはメール/パスワードを設定でき、完全なアカウントになります。この親アカウントであるマネージャーは、別のアカウント (おそらく配偶者) を招待して、この子アカウントの別のマネージャーとして機能させることもできます。

更新:いくつかの詳細情報:

アカウント モデル

class Account < ActiveRecord::Base

validates :email, presence: true, 
                format:     { with: VALID_EMAIL_REGEX},
                uniqueness: { case_sensitive: false },
                length:     { maximum: 32 },
                unless: :child?

has_many :relationships, foreign_key: "manager_id", dependent: :destroy
has_many :cares, through: :relationships, source: :care
has_many :reverse_relationships, foreign_key: "care_id", class_name: "Relationship", dependent: :destroy
has_many :managers, through: :reverse_relationships, source: :manager
...
def child?
  false
end

class CareUser < Account

 def child?
   true
 end
end

関係モデル

class Relationship < ActiveRecord::Base
 attr_accessible :care_id, :manager_id, :type

 belongs_to :manager, class_name: "Account"
 belongs_to :care, class_name: "Account"

 validates :manager_id, presence: true
 validates :care_id, presence: true
end

ケアコントローラー

class CaresController < ApplicationController
  def index
     @cares = current_user.cares
  end

  def new
    @user = CareUser.new
    @care = Relationship.new
  end

  def create
    @user = CareUser.new(params[:first_name])
    logger.info @user.inspect
    if @user.save(false)
      @care = current_user.relationships.build(current_user.id, @user.id, params[:relation])
      if @care.save
        flash[:success] = "New care has been successfully added."
      else
        flash[:error] = "Failed"
        render action: new
      end
    else
      flash[:error] = "Failed adding user"
      render action: new
    end

  end

  def show
  end

  def edit
  end

  def update
  end

  def destroy
  end
end

@user = CareUser.new、サブクラスを取得すると...が、親クラスuninitialized constant CaresController::CareUserに設定してもエラーは表示されません。@user = Account.new

送信フォーム cares/new.html.erb

フォームを設定する正しい方法はわかりませんが、2 つのモデルに送信するため、form_tag代わりにform_for. 現在、問題がフォーム、モデル、またはコントローラーにあるのかどうかわからないため、フォームを正しく送信できないようです。

<div class="row">
  <div class="span6 offset3">
    <h1>New care</h1>
    <%=  form_tag("/cares", method: :post) do %>
        <% if @user.errors.any? %>
            <div id="error_explanation">
              <div class="alert alert-error">
                The form contains <%= pluralize(@user.errors.count, "errors") %>
              </div>
              <ul>
                <% @user.errors.full_messages.each do |message| %>
                    <li><%= message %></li>
                <% end %>
              </ul>
            </div>
        <% end %>
        <% if @care.errors.any? %>
            <div id="error_explanation">
              <div class="alert alert-error">
                The form contains <%= pluralize(@care.errors.count, "errors") %>
              </div>
              <ul>
                <% @care.errors.full_messages.each do |message| %>
                    <li><%= message %></li>
                <% end %>
              </ul>
            </div>
        <% end %>

        <%= label_tag(:first_name, "First name:") %>
        <%= text_field_tag(:first_name) %>

        <%= label_tag(:relation, "Relationship") %>
        <%= select_tag(:relation, options_for_select([ ["Son", "1"], ["Daughter", "2"], ["Father", "3"], ["Mother", "4"], ["Grandson", "5"], ["Granddaughter", "6"], ["Grandfather", "7"], ["Grandmother", "8"] ])) %>


        <br>
        <%= submit_tag("Create care account") %>


    <% end %>
  </div>

</div> 
4

2 に答える 2

0

あなたの要件のために、

I have a user model {id, name, address, email, password, etc ... }, and I want to be able to allow that user to create and manage other users. 

ユーザーのマネージャーが誰であるかを追跡したいだけの場合、解決策はusers テーブル自体に「 manager_id 」列を作成することです。manager_id が NULL の場合、ユーザー自身がトップ マネージャーであり、そうでない場合は、対応するマネージャー ID です。

関係の詳細を保存する必要がある場合は、分離関連テーブルuser_managersを作成して、次のように言う必要があります。

user has_many :managers、user_mangers 経由。

このような場合、常に最初にユーザー レコードを作成する必要はありません。新しいユーザーを作成するときはいつでも、必要に応じてそのユーザーにマネージャーを割り当てると思います。

manager = User.first
user = User.new
user_manager = manager.user_managers.new
user_manager.student = user
user.save!

user_managers テーブル構造:

 id, user_id, student_id
于 2013-06-01T20:36:29.423 に答える