2011-04-13 65 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 
相关问题