开发者

How do i create an object if it has more than one belongs_to?

I have the following:

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_man开发者_运维问答y :entries          
  validates_uniqueness_of :user_name
  validates_presence_of :user_name, :length => { :minimum => 3 }
end

I can Create Orgs and Users... How do i create an entry if there are two belongs_to? and what is this pattern called?


Double nested resources are tricky. The trick with users usually is to keep it out of your desired entry path.

Your question is kind of broad, but if you specify more information, people would be able to help you better. Also, I would recommend using the gem Devise for your user management system. Since you're using 'users' I would assume you want users from orgs to create entries. The entry created would be a part of org and the user would be the session's current user. Sorry if I am wrong to assume this.

Your routes.rb file can look something like this (assuming rails 3):

resources :orgs do resources :entries end

Then the create of your entry controller would look like:

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

And you'd want to set the org for the entire class by making a method that loads your current org and do a before_filter :loadOrg

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

This is of course assuming your path is something like: /org/(id)/entry/(entry_id)

and not

/org/(id)/user/(user_id)/entry/(entry_id)

which in my opinion is unnecessary and can lead to more problems. You can always create a userpage model that calls all entries by users, but the default route doesn't necessarily have to include users in the path.


I don't see any problem.

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

Now questions to clarify what do you need:

  • Can @entry belongs both org and user at the same time? Or it can belongs to only one of them?
  • Should @entry belongs to at least one of them?

If @entry supposed to belong only one of them, so you should use 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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜