在Rails中,使用HABTM,如何避免连接表中的多个INSERT

发布于 2024-10-14 10:56:21 字数 548 浏览 5 评论 0原文

使用 has_and_belongs_to_many 关系,我有以下行为:

model A
has_and_belongs_to_many :B, :join_table => "A_B"
has_and_belongs_to_many :C, :join_table => "A_B"

table A_B
A_id
B_id
C_id

当前行为:

在执行 A.save 时,我在 A_B 表中得到 2 个插入语句 - A_id 已设置,B_id 已设置,并且 C_id = 0,而另一个仅包含 A_id和 C_id 已设置(INSERT 语句中没有 B_id)。因此,我的 JOIN 表中有 2 行

期望的行为:

在执行 A.save 时,我想要 1 INSERT 到 A_B 表中,其中所有 3 个 id 均已正确设置。

我该怎么做?

根据我的理解(因为我实际上无权更改数据库 - 遗留),我不能对此使用 has_many :through ,因为 JOIN 表需要 id 列。如果情况并非如此,我愿意接受任何建议。

Using a has_and_belongs_to_many relationship, I have the following:

model A
has_and_belongs_to_many :B, :join_table => "A_B"
has_and_belongs_to_many :C, :join_table => "A_B"

table A_B
A_id
B_id
C_id

Current behavior:

when doing A.save, I get 2 insert statements into the A_B table - A_id is set, B_id, is set, and C_id = 0, and the other where all only A_id and C_id are set (no B_id in the INSERT statement). Therefore, there are 2 rows in my JOIN table

Desired behavior:

when doing A.save, I want 1 INSERT into A_B table, where all 3 ids are set correctly.

How do I do this?

From my understanding (as I don't really have access to change the db - legacy), I can't use has_many :through on this, as the JOIN table would require an id column. If that is not true, I am open to any suggestions.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

请你别敷衍 2024-10-21 10:56:21

您也许可以使用扩展方法来做到这一点。您可能仍然会访问数据库 2 次,但其中一次可能是更新。

has_and_belongs_to_many :B, :join_table => "A_B" do
  def save
   abc = A.find_or_create_by_a_id(self.a_id)
   abc.b = self.b
   abc.save
  end
end

has_and_belongs_to_many :C, :join_table => "A_B" do
  def save
   abc = A.find_or_create_by_a_id(self.a_id)
   abc.c = self.c
   abc.save
  end
end

当然,您需要检查是否是新记录并进行相应处理。不确定您是否可以在关联扩展中重新定义保存......

You might be able to do this with an extension method. You'd probably still get the 2 trips to the DB, but one can be an update.

has_and_belongs_to_many :B, :join_table => "A_B" do
  def save
   abc = A.find_or_create_by_a_id(self.a_id)
   abc.b = self.b
   abc.save
  end
end

has_and_belongs_to_many :C, :join_table => "A_B" do
  def save
   abc = A.find_or_create_by_a_id(self.a_id)
   abc.c = self.c
   abc.save
  end
end

Of course, you need to check if it's a new record and handle according. Not sure if you can redefine save in an association extension....

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文