سؤال

I just finished the Michael Hartl Rails Tutorial. Trying to make something of my own.

I am having trouble with getting rails to understand the relationships I'm trying to create. I'll try to simplify this as much as possible. A tree with branches, twigs and leaves would be apt, but...

I'll use the parent child format as an example. So naturally I have users, and let's say users create families.

So:

Class User < ActiveRecord::Base

 has_many :families
 has_many :parents
 has_many :children

end

Class Family < ActiveRecord::Base

 belongs_to :user
 has_many :parents

end

Class Parent < ActiveRecord::Base

 belongs_to: :user
 belongs_to: :family
 has_many: :children

end

Class Child < ActiveRecord::Base

 belongs_to :user
 belongs_to :parent

end

As you can see, I want a child to belong to the parent which belongs to the family, but the child itself does not belong to a family except through the parent. Sad if this weren't a metaphor, but true in this particular case. ;)

I have tried under Parent:

has_many :children, through: :parent

and

has_many :children, through: :family

But that didn't work.

When I try to use:

User.family.new

or

User.child.new 

...it says the method doesn't exist. I take that to mean that it isn't understanding the relationships.

What am I doing wrong?

If it's relevant, the only thing in the family, parent, child tables for now are these columns:

  t.string :content
  t.integer :user_id
هل كانت مفيدة؟

المحلول

You don't have these methods:

User.family.new
User.child.new

When you define has_many association, you just have these methods to create new object associated:

collection.build(attributes = {}, …)
collection.create(attributes = {})

Follow Rails guide:

collection is replaced with the symbol passed as the first argument to has_many

You can look at this has_many association reference for more info. So, If User want create new family or child, you need to use these methods:

user = User.create(name: "ABC") # create new user and save to database. 
user.families.build  # create new family belongs to user
user.children.build  # create new children belongs to user

user.families.create # create new family belongs to user and save it to database.
user.children.create # create new child belongs to user and save it to database.

If you want to get children belongs to parent which belongs to family, you can modify your association:

Class Family < ActiveRecord::Base

 belongs_to :user
 has_many :parents
 has_many :children, through: :parents # Get children through parents
end

Class Parent < ActiveRecord::Base

 belongs_to: :user
 belongs_to: :family
 has_many: :children

end

Class Child < ActiveRecord::Base

 belongs_to :user
 belongs_to :parent

end

Now, you can get all children belongs to parents which belongs to a family ( I suppost family have id = 1) with:

 f = Family.find(1) # Find a family with id = 1
 f.children # Get all children in family.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top