0

所以这是一个普遍的问题:

我有 3 张桌子,为简单起见,我们称它们为 a,b,c

表一个
ID

表 b
id
a_id
c_id

表 c
id

因此 b 中的记录将 a 和 c 中的记录关联起来。

问题是:当用户提交表单时,会提交一些哈希值,每个哈希值代表 b 中需要填写的记录。现在我只是简单地删除和重新添加,我希望能够迭代现有的关联和(这就是它变得棘手的地方)如果数据库中的关联(D)比提交的(S)多,那么删除 DS 条目,如果 DS 相等则替换当前条目,如果 DS 为负数,则添加 SD 记录。

然后将它们全部更新为新的关联。

我尝试使用循环执行此操作,但问题是活动记录查询返回一个数组,我仍然有一个哈希要迭代。因为我不能让两个数组相互同步循环,所以我不确定从这里去哪里。有任何想法吗?

注意:我可以发布实际代码,但是处理此代码的控制器函数非常长。


编辑:我觉得我在这里不够具体,尽管我越来越确定这一切都必须是手动的,这是我正在寻找的一个粗略示例。

submitted_hash[:whatever].each do |key,value|
    #value.first_submit
    #value.second_submit
end

ModelName.find(:all, :conditions => ["fk_ref = ?", params[:fk_ref]]).each do |model_value|
end

现在,如果“ModelName.find”返回的值比“submitted_hash”中的当前值多,那么我们需要创建更多引用来满足需要。

如果“ModelName.find”返回小于“submitted_hash”,那么我们将在数据库中添加差异,作为行。

如果它们相等,则不需要在这部分采取行动。

最后,我需要使用 ModelName.find(:all, :conditions) ,它现在应该返回与我们的哈希值相同的数量(我已经做到了这一点)。

现在不知何故,我需要同时遍历我们的 ModelName.find 和 params[:subbmited_hash],以便记录 1 被提交 1 替换,然后记录 2 被提交 2 等等。

注意:所以我可以理解我的意图,我正在尝试做的是替换记录而不进行任何不必要的删除,如果有人提交 6 并需要 3,我的代码现在将删除 6,并添加3个新的。这可行,但每次更新时都会永久删除 6 行(在这种情况下)。我希望它删除 3(两个值的差异)并将剩余的 3 更新为新提交的值。

4

1 回答 1

1

您的文字对我来说不是很清楚,但是您可以寻找的最接近的东西是 mysql replace命令。

如果没有对应的行,它会插入一个新行,否则它会进行更新。

像这样:

  REPLACE INTO b (id, a_id, c_id) VALUES (5, 2, 3);

参考:http ://dev.mysql.com/doc/refman/5.0/en/replace.html

但它不会删除旧的无效条目。我认为您需要自己/手动完成。数据库不是这样工作的。

使用 ORM 框架可以做到这一点。我对rails一无所知,但也许这个页面可以帮助你:

http://blog.gridworlds.com/rails/delete-or-delete-removing-things-in-rails

或者尝试寻找rails“删除孤儿”

于 2012-08-06T19:39:51.667 回答