2011-04-13 66 views
1

我有以下幾點:如何創建一個對象,如果它有多個belongs_to?

class Org < ActiveRecord::Base 
    has_many :users    
    has_many :entries   
end 

class Entry < ActiveRecord::Base 
    belongs_to :org    
    belongs_to :user    
    validates_presence_of :entry_text 
end 

class User < ActiveRecord::Base 
    belongs_to :org    
    has_many :entries   
    validates_uniqueness_of :user_name 
    validates_presence_of :user_name, :length => { :minimum => 3 } 
end 

我可以創建單位和用戶...如何創建一個條目,如果有兩個belongs_to的?這個模式叫什麼?

回答

2

雙重嵌套資源是棘手。用戶的訣竅通常是讓它遠離你想要的入口路徑。

你的問題有點寬泛,但如果你指定更多的信息,人們將能夠更好地幫助你。另外,我會建議使用gem Devise來爲你的用戶管理系統。由於您使用的是'用戶',因此我會假設您希望來自org的用戶創建條目。創建的條目將成爲組織的一部分,用戶將成爲會話的當前用戶。對不起,如果我錯了承擔這一點。

你的routes.rb文件可以是這個樣子(假設軌道3):

資源:機構單位做 資源:項目 結束

然後創建輸入控制器的會是什麼樣子:

@entry = @org.entries.new(params[:topic]) 
@entry.user = current_user #or however you are managing the current user's session. 

而且你會想通過加載當前的組織方法來設置整個類的組織,做的before_filter:loadOrg

def loadOrg 
    @org = Org.find(params[:id]) 
end 

當然這是假設你的路徑是這樣的:/組織/(ID)/項/(entry_id)

,而不是

/組織/(ID)/用戶/(USER_ID )/ entry /(entry_id)

在我看來這是不必要的,可能導致更多的問題。您始終可以創建一個用戶頁面模型,用於調用用戶的所有條目,但默認路由不一定要包含路徑中的用戶。

0

我沒有看到任何問題。

@entry = Entry.create(:entry_text => "Hello World!") 

現在問題來澄清你需要什麼:

  • @entry屬於在同一時間都orguser?或者它只能屬於其中之一?
  • @entry是否屬於它們中的至少一個?

如果@entry應該只屬於其中之一,所以你應該使用Polymorphism

http://railscasts.com/episodes/154-polymorphic-association

class Entry < ActiveRecord::Base 
    belongs_to :textable, :polymorphic => true 
    validates_presence_of :entry_text 
end 

class Org < ActiveRecord::Base 
    has_many :users    
    has_many :entries, :as => :textable  
end 

class User < ActiveRecord::Base 
    belongs_to :org    
    has_many :entries, :as => :textable   
    validates_uniqueness_of :user_name 
    validates_presence_of :user_name, :length => { :minimum => 3 } 
end 
相關問題