Rails 2.3:替换记录关联而不是删除

时间:2012-08-06 18:57:56

标签: mysql ruby-on-rails ruby

所以这是一般问题:

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

表a 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更新为新提交的值。

1 个答案:

答案 0 :(得分: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“delete orphan”