1

我刚刚完成了 Michael Hartl Rails 教程。试图做我自己的东西。

我无法让 Rails 了解我正在尝试创建的关系。我会尽量简化这一点。一棵有树枝、树枝和树叶的树会很合适,但是......

我将以父子格式为例。所以自然我有用户,假设用户创建家庭。

所以:

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

如您所见,我希望孩子属于属于家庭的父母,但孩子本身不属于家庭,除非通过父母。如果这不是一个比喻,但在这种特殊情况下是真实的,这很可悲。;)

我在父母下试过:

has_many :children, through: :parent

has_many :children, through: :family

但这没有用。

当我尝试使用时:

User.family.new

或者

User.child.new 

...它说该方法不存在。我认为这意味着它不了解这些关系。

我究竟做错了什么?

如果它是相关的,那么现在家庭、父、子表中唯一的就是这些列:

  t.string :content
  t.integer :user_id
4

1 回答 1

2

你没有这些方法:

User.family.new
User.child.new

当您定义has_many关联时,您只需使用这些方法来创建关联的新对象:

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

遵循 Rails 指南:

集合被作为第一个参数传递给 has_many 的符号替换

您可以查看这个has_many 关联参考以获取更多信息。因此,如果User要创建新的家庭或孩子,您需要使用以下方法:

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.

如果你想让孩子属于属于家庭的父母,你可以修改你的关联:

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

现在,您可以让所有孩子都属于属于一个家庭的父母(我假设家庭的 id = 1):

 f = Family.find(1) # Find a family with id = 1
 f.children # Get all children in family.
于 2012-11-29T05:33:13.840 回答