2016-04-30 60 views
1

我在我的應用程序中使用Active Admin。Ruby on Rails,用戶模型和活動管理查詢

該應用程序有一個用戶模型(設計),但我有3個用戶組 - 家長,教師和學生。每個人都有自己的模型。

student.rb 

belongs_to :user 

user.rb 

has_one :student 



parent.rb 

belongs_to :user 

user.rb 

has_one :parent 

我想在這裏做的是存儲,這將是整個用戶羣體相同的用戶模型,使屬性「名字,姓氏,電子郵件」等,然後使用個人用戶模型來存儲每個用戶組所獨有的屬性。我正在使用主用戶表和三個用戶組表之間的一對一關係。

這裏(注意我還沒有顯示在用戶組表中的所有屬性):

enter image description here

的問題是,這是不是與活動管理員的工作這麼好。在視圖中,我必須創建一個用戶,然後以不同的視圖分配父母和學生。我想要一個表單,例如,學生的用戶記錄可以放入主用戶表中的屬性以及學生表中的唯一屬性,而無需轉到多個模型視圖以完成記錄。這太複雜了。

有沒有辦法在一個視圖中渲染來自不同模型的輸入?即學生在用戶表中具有「名」,「姓」......以及學生獨有的輸入?

如果你正在採取的方法,我在這裏採取什麼方法你會遵循?我甚至不確定我是否正確地完成了這些協會。事實上,我甚至不確定這是做到這一點的最有效的方法。

我正在使用枚舉來分配角色。

希望這裏有任何指導。謝謝。

回答

0

Student s,Guardian s和Teacher s都是User的一種類型。爲什麼不把它們合併成一個單一的類型,並使用繼承來表示它們是一種常見的類型?

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

class Teacher < User 
    # ... 
end 

class Guardian < User 
    # ... 
end 

class Student < User 
    # ... 
end 

您需要通過遷移到添加type列,也寫了任務,將它們合併成一個共同的表,但它可能會是值得的。

請參閱STI in Rails:http://api.rubyonrails.org/classes/ActiveRecord/Inheritance.html

編輯:

如果你不想去的STI的路線,你將不得不使用嵌套的屬性

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

然後在admin/user.rb()添加自定義form

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 

如果您使用強參數,請確保將用戶,guardia的相應參數列入白名單n_attributes等

在我看來,這裏的嵌套是非常醜陋的,這種規範化的模式將難以維護和查詢。

+0

嗨,謝謝,我曾試過STI,但有幾位消息來源警告不要使用STI來達到這個目的?結果比現在好一點,但我有點害怕。 STI是一種安全可靠的方法嗎? – Co2

+0

缺點是有一些冗餘 - 你的表中只有一些字段適用於某些用戶類型(例如學生的'class_id')。但我認爲這是一個小的代價。在這些不同類型的用戶的行爲,視圖和控制器中是否有重疊?如果是這樣,我會認真考慮使用單個表來表示這些用戶模型。 –

+0

我更新了非STI方法的答案,您將不得不在表單中使用'nested_pa​​rams'。 –