【问题标题】:Rails: belongs_to multiple > MethodsRails:belongs_to multiple > 方法
【发布时间】:2012-11-16 20:02:09
【问题描述】:

我刚刚完成了 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

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

我在Parent下试过了:

has_many :children, through: :parent

has_many :children, through: :family

但这没有用。

当我尝试使用时:

User.family.new

User.child.new 

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

我做错了什么?

如果相关的话,family、parent、child 表中现在唯一的就是这些列:

  t.string :content
  t.integer :user_id

【问题讨论】:

  • 您正在呼叫User.family.newUser.family 未定义。 AR 关系不创建类方法,只创建实例方法,因此如果您有@parent,则可以调用@parent.children,前提是您在父方法中有has_many :children。在这种情况下只需调用Child.new@parent.children.build,您需要家长来执行此操作
  • 原谅我,刚刚离开 railstutorial 来尝试我自己的应用程序,但是在教程中你有 Microposts 和 Users,当你设置 Micropost belongs_to User 和 User has_many Microposts 你可以然后做 User.microposts 或 User.micropost.new。为什么会有所不同?
  • User的使用是调用名为'User'的模型。它不是实际用户,而是您正在调用的模型。 User.create 将创建一个实例化对象用户。例如:user_object = User.createuser_object 是 User 类型的实例化对象。
  • 只是一个观察,但如果让 Child 和 Parent 成为 User 的子类,并有一个 Family 类,它有_many 个父母(并且通过父母有_many 个孩子),这不是最有意义的吗?有很多孩子的父母。也许我只是过度分析了你的例子。

标签: ruby-on-rails methods table-relationships


【解决方案1】:

你没有这些方法:

User.family.new
User.child.new

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

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

遵循 Rails 指南:

collection 被作为第一个参数传递给 has_many

您可以查看此has_many association reference 了解更多信息。 所以,如果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.

【讨论】:

  • 谢谢。是的,我正在尝试按照 railstutorial 建议的方式进行操作。他建议创建关系并改为使用 user.micropost.create,而不是执行 Micropost.create。这就是我想要达到的目标。我认为您的帖子可能已经解决了我的问题,但还不确定。它绝对比微博和普通留言板更复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多