如果它有多个belongs_to,我如何创建一个对象?

时间:2011-04-13 14:00:28

标签: ruby-on-rails-3 activerecord

我有以下内容:

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 个答案:

答案 0 :(得分:2)

双嵌套资源很棘手。用户的诀窍通常是使其远离您想要的进入路径。

您的问题有点广泛,但如果您指定了更多信息,那么人们就能够更好地为您提供帮助。另外,我建议将gem Devise用于您的用户管理系统。由于您使用的是“用户”,我认为您希望orgs中的用户创建条目。创建的条目将是组织的一部分,用户将是会话的当前用户。对不起,如果我错误地假设这一点。

你的routes.rb文件看起来像这样(假设有rails 3):

资源:orgs做      资源:条目    端

然后,您的输入控制器的创建将如下所示:

@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

这当然假设您的路径类似于:/ org /(id)/ entry /(entry_id)

而不是

/组织/(ID)/用户/(USER_ID)/进入/(entry_id)

我认为这是不必要的,可能导致更多问题。您始终可以创建用户调用所有条目的用户页面模型,但默认路由不一定必须包含路径中的用户。

答案 1 :(得分: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