2016-04-30 14 views
1

私は自分のアプリケーションでActive Adminを使用しています。Ruby on Rails、ユーザーモデル、Active Adminクエリ

アプリケーションにはUsersモデル(Devise)がありますが、私は3つのユーザーグループ、つまり親、教師、学生がいます。それぞれには独自のモデルがあります。

例えば、私がここでやろうとしています何

student.rb 

belongs_to :user 

user.rb 

has_one :student 



parent.rb 

belongs_to :user 

user.rb 

has_one :parent 

ので、「FIRST_NAME、LAST_NAME、電子メール」などユーザーモデルのユーザーグループ間で同じになる属性を格納して、個々を使用しています各ユーザーグループに固有の属性を格納するためのユーザーモデル。私は、メインユーザーテーブルと3つのユーザーグループテーブルの間に1対1の関係を使用しています。ここで

(私は、ユーザーグループのテーブル内のすべての属性を表示していないに注意してください)。

enter image description here

問題は、これは、アクティブな管理にとてもうまく機能していないです。ビューで私はユーザーを作成し、次に異なるビューで親と学生を割り当てる必要があります。たとえば、学生のユーザーレコードを、複数のモデルビューに移動してレコードを完成させることなく、メインのUsersテーブルの属性とStudentsテーブルの一意の属性を入れて、単一のフォームを作成したいと考えています。あまりにも複雑です。

異なるモデルからの入力を1つのビューでレンダリングする方法はありますか?つまり、生徒には、生徒固有の入力とともに、「名前」、「姓」などがUsersテーブルから表示されますか?

あなたがアプローチを取っていたら、私はここにあなたが従う方法をとっていますか?私は団体を正しくやっているかどうかもわからない。実際、私はこれを行う最も効率的な方法であるとは確信していません。

私はenumを使用して役割を割り当てています。

こちらのご案内をお待ちしております。ありがとう。

答えて

0

Students、Guardians、およびTeacherはすべてユーザの一種です。単一の型にそれらを統合し、それらを共通の型として表現する継承を使用してみませんか?

class User < ActiveRecord::Base 
    # ... 
end 

class Teacher < User 
    # ... 
end 

class Guardian < User 
    # ... 
end 

class Student < User 
    # ... 
end 

あなたは移行経由type列を追加し、また、共通テーブルにそれらをマージするタスクを記述する必要がありますが、それはおそらく努力の価値があるだろう。

「Sails in Rails:http://api.rubyonrails.org/classes/ActiveRecord/Inheritance.html」を参照してください。

EDIT:

あなたはSTIのルートを移動したくない場合は、次にadmin/user.rbでカスタムformを追加し、ネストされた属性

class User < ActiveRecord::Base 
    accepts_nested_attributes_for :teacher 
    accepts_nested_attributes_for :guardian 
    accepts_nested_attributes_for :student 
end 

を使用する必要があります():

ActiveAdmin.register User do 
    form do |f| 
    f.inputs "User Inputs" do 
     # ... 
     f.input :email 
     # ... 
    end 

    f.inputs "Guardian Attributes", for: [:guardian, f.object.guardian || Guardian.new] do |g| 
     g.input :mobile_no 
    end 

    # Repeat for teacher, Student, etc... 
    end 
end 

強力なパラメータを使用している場合は、適切なパラメータであるUser、guardia n_attributesなど

私の意見では、ここでのネストはかなり醜いです。この正規化されたスキーマを維持したりクエリするのは難しいでしょう。

+0

こんにちは、ありがとう、私は前にSTIを試しましたが、いくつかの情報源はこの目的のためにSTIを使用することに対して警告しましたか?結果は今よりもやや良いが、私はそれを少し怖がっていた。 STIは安全で頑丈な道ですか? – Co2

+0

欠点は、いくつかの冗長性があることです。あなたのテーブルには、特定のユーザタイプ(例えば、学生の 'class_id')にのみ適用されるフィールドがあります。しかし、私はそれが支払う小さな値段だと思う。これらの異なるタイプのユーザーそれぞれの行動、ビュー、およびコントローラーに重複はありますか?もしそうなら、私は真剣にこれらのユーザーモデルを表現するために単一のテーブルを使用することを検討します。 –

+0

STI以外の方法で自分の答えを更新したので、あなたのフォームに 'nested_pa​​rams'を使わなければなりません。 –