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

时间:2011-01-26 02:13:43

标签: ruby-on-rails join insert has-and-belongs-to-many

使用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时,我想在A_B表中插入1个INSERT,其中所有3个ID都设置正确。

我该怎么做?

根据我的理解(因为我实际上没有权限更改db - legacy),我不能使用has_many:通过这个,因为JOIN表需要一个id列。如果不是这样,我愿意接受任何建议。

1 个答案:

答案 0 :(得分:0)

您可以使用扩展方法执行此操作。您可能仍然可以获得数据库的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

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