1

我有4個複雜關係的模型。其中3個應該有描述,應該只對創建的用戶啓用。換句話說,每個用戶都有自己的Group(例如)或Post的其他描述。我們只討論一個模型,因爲其他模型非常相似。我有什麼: user.rb私人領域的多個模型,如何使RoR?

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, :omniauthable, omniauth_providers: [:vkontakte] 
    has_and_belongs_to_many :groups 
    has_many :descriptions 
end 

group.rb

class Group < ActiveRecord::Base 
    has_and_belongs_to_many :users 
    has_many :descriptions, :as => :describable 
    accepts_nested_attributes_for :descriptions 
end 

description.rb

class Description < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :describable, :polymorphic => true 
end 

表描述

create_table "descriptions", force: :cascade do |t| 
    t.integer "user_id" -- belongs_to 
    t.string "content" 
    t.integer "describable_id" 
    t.string "describable_type" 
    end 

如何顯示屬於current_user(我使用devise)的組的說明?如何使用嵌套描述構建更新表單?

我試着去做,但它不起作用。我已經問過關於問題here的一部分的問題。

+0

您在用戶模型中缺少多態關聯的一部分,它應該是'has_many:descriptions,as :: describeable'(您在組模型中正確) – Roma149

+0

@ Roma149用戶不是可描述的模型。它只是has_many - belongs_to的許多描述。並且這些描述描述了模型組,帖子等。 – nobilik

+0

好的,但是'Description'模型中沒有'belongs_to:user',所以我想如果您嘗試使用該關聯會得到一個錯誤。 – Roma149

回答

0

爲什麼你有一個額外的型號叫description

雖然它本身不是一個問題,你真的需要有一個模型只是爲了說明。

-

檔案

相反,你不妨把細節到輪廓模型,或者乾脆在用戶模型(有什麼錯adding extra attributes to a Devise mode升)。

我們使用輪廓模型,這給我們增加許多「額外」字段的能力,因爲我們希望給user型號:

enter image description here

你可以將它設置是這樣的:

#app/models/user.rb 
class User < ActiveRecord::Base 
    has_one :profile 
    accepts_nested_attributes_for :profile 
    before_create :build_profile 

    delegate :description, :name, to: :profile, prefix: false #-> @user.description 
end 

#app/models/profile.rb 
class Profile < ActiveRecord::Base 
    belongs_to :user 
end 

這將允許您創建每個用戶一個配置文件,有一個配置文件製作而成創建用戶時,再更改配置文件裏面一個儘可能多的選擇你希望的。

+0

@Rich_Peck我的英語不太好,對不起。我用更多的解釋更新了我的問題。因此,任何用戶都可以爲組,論壇,帖子等進行描述。這將是類似於任何類型記錄的私人筆記。我只需要它的創建者/所有者可見。如果我正確地理解了你,你回答我如何向用戶對象添加說明。 – nobilik

+0

是的,我回答了我以爲你在問什麼。如果用戶可以創建組/板等的描述,那麼這將是一個完全不同的答案。我會在一分鐘內更新 –