【问题标题】:How to use the create method for a many:many through relationship如何通过关系使用多:多的创建方法
【发布时间】:2015-07-31 13:22:44
【问题描述】:

User 和Organization 通过Relationship 具有多对多关联。

Relationship 模型指定User 是否是Organization 的成员(member 布尔值)。

如果需要创建一个新的Organization 以及一个与该Organization 相关的新User,我目前执行以下操作:

Organization.create!(name: "name", ...).users.create(email: "email@email.com",...)

但是,这还没有将Relationship 模型中的member 布尔值设置为true。

有没有办法在上面的命令中包含这个?或者这是否只能与创建 user 和 organization 记录分开?因为那样的话它需要相对大量的代码,并且在前面的create 行之后添加似乎有点低效:

@user = User.find_by(username: username)
@organization = Organization.find_by(name: name)
@relationship = @organization.relationships.find(@user)
@relationship.update_attributes(member: true)

【问题讨论】:

  • 但是你为什么需要这个布尔值呢?如果user 有一个relationship 和organization,那么他已经是会员了,不是吗?
  • 不一定,在我的用例中,用户可能只是组织的版主而不是成员。
  • 所以在这种情况下,您需要手动设置该布尔值或为其设置默认值。
  • “手动设置”是指我现在的做法吗?不过,我想知道Organization.create! 行是否正确,同时考虑到我发布的问题here。
  • 我会单独做,首先创建organization,然后我会实例化一个new用户并将其添加到organization,如下所示:organization.users << User.new(email: "asd@asd.com", member: true)

标签: ruby-on-rails ruby ruby-on-rails-4 associations


【解决方案1】:

如果你拆分你的创建行,你可以避免一些find 方法:

org = Organization.create!(name: "name", ...)
user = org.users.create(email: "email@email.com", ...)
Relationship.find_by(organization_id: org, user_id: user).update_attributes(member: true)

我尝试使用accepts_nested_attributes_for 尝试查看是否有一种简单的方法可以使其工作,但在这种情况下,这种方法看起来会更加复杂。

此链接描述了类似的设置,但它与many-to-one 关系:https://stackoverflow.com/a/25941676/3993528

【讨论】:

  • 谢谢约瑟夫,我同意这使它更短。 accepts_nested_attributes_for 确实正是我正在寻找的东西,我最初是为 many-to-one 关系工作的。现在我已经将它转换为many-to-many 关系,它似乎不再起作用(或者至少它需要在create 方法中进行调整)。我在这里有一个单独的帖子:stackoverflow.com/q/31750918.
猜你喜欢
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 2021-02-27
相关资源
最近更新 更多