Ruby on rails 将更新保存到rails中的对象
我试图在rails应用程序中更新我的一个对象,但更改不起作用。没有错误,使用调试器只会显示它认为所有内容都在更新 不管怎样,这是有问题的代码Ruby on rails 将更新保存到rails中的对象,ruby-on-rails,ruby,Ruby On Rails,Ruby,我试图在rails应用程序中更新我的一个对象,但更改不起作用。没有错误,使用调试器只会显示它认为所有内容都在更新 不管怎样,这是有问题的代码 qm = QuestionMembership.find(:first, :conditions => ["question_id = ? AND form_id = ?", q_id, form_id]) qm.position = x qm.save 为了便于参考,QuestionMembership有question\u id、f
qm = QuestionMembership.find(:first, :conditions => ["question_id = ? AND form_id = ?", q_id, form_id])
qm.position = x
qm.save
为了便于参考,QuestionMembership有question\u id、form\u id和position字段。都是整数,没有db约束
这基本上就是我的表格和问题之间的连接表
通过代码单步执行,qm获得一个有效的对象,该对象的位置确实更改为x值,save返回“true”
但是,方法退出后,数据库中的对象将保持不变
我缺少什么?尝试将qm.save更改为qm.save!并查看是否收到异常消息
编辑:在调用.save!时查看日志会发生什么!?它是否生成预期的SQL?qm.save的结果是什么?对还是错?那么关于qm.errors的问题呢,这些问题对您有意义吗?development.log怎么说?您可能找不到您认为自己是的对象。在irb中进行一些实验可能会有所启发 另外,一般来说,当只更改一个属性时,最好编写
qm.update_attribute(:position, x)
而不是设置和保存。Rails将只更新该列,而不是整行。您还可以从清理数据中获益。我经常遇到这个问题。(我本想始终如一地说,但我不能,因为这意味着我会知道它将在何时发生。) 虽然我没有解决根本问题的方法,但我发现只有当我尝试更新
mysql文本时才会发生这种情况。我的解决方法是将字段设置为执行以下操作:
qm.position = ""
qm.save
qm.position = x
qm.save
回答其他人的问题。。。当我运行qm.save时代码>我没有错误。我没有尝试过qm.save?
当我在rails控制台中运行我的代码时,一切都完美地工作了,使用相同的查询重新找到对象可以带来预期的结果
我在使用qm.update\u属性(…
时也遇到了同样的问题
我的解决方法让我一瘸一拐地走了这么远,但希望这个线程上的某个人能够提供帮助。是否有事后保存
发出的SQL是否正确?在开发日志中,您可以实际看到生成的SQL
对于这样的事情:
qm = QuestionMembership.find(:first, :conditions => ["question_id = ? AND form_id = ?", q_id, form_id])
qm.position = x
qm.save
您应该看到以下效果:
SELECT * FROM question_memberships WHERE question_id=2 AND form_id=6 LIMIT 1
UPDATE question_memberships SET position = x WHERE id = 5
您能输出您实际看到的sql以便我们进行比较吗?使用./script/console并一步一步地运行此脚本
运行第2行时,查看对象的位置字段是否更新
然后点击qm.save或qm.save!…进行测试
看看会发生什么。也如Tim所述。检查日志检查你的问题成员类别,确认职位没有类似的内容
attr_readonly :position
调试这个的最好方法是
tail -f log/development.log
然后打开另一个控制台并执行执行save语句的代码。验证是否执行了实际的SQL Update语句。检查以确保您的数据库设置正确。如果您正在使用多个数据库(或未将默认的sqlite3数据库更改为MySQL),则可能使用了错误的数据库
运行./script/console中的命令,查看是否看到相同的行为
验证是否保存了类似的对象(例如表单或问题)
如果表单或问题保存,请查找QuestionMembership与表单或问题对象之间的差异。结果表明,它发出了错误的SQL。基本上,它是通过id列查找QuestionMembership对象,而id列不存在
我的印象是,虽然我似乎被误导了,但在很多关系中,那个专栏是没有必要的
要修复此问题,我只需将id列作为主键添加到表中。感谢所有的指针。更新属性或调用:
qm.reload
在qm.save之后
同样的结果。至少可以说,我很困惑。我是托马斯,很高兴认识你,困惑!;)当你看到调用.save的日志时会发生什么!?它是否生成了预期的SQL?出现了错误的SQL。它产生的结果是:更新“问题成员资格”设置“位置”=3,“更新位置”='2009-03-17 19:09:44',其中“id”=NULL因为这是一个联接表,所以没有“id”字段。回到绘图板上。我认为联接表不喜欢id字段。我怀疑rails不知道它不应该需要id。我会仔细检查问题、成员资格和问题成员资格类中的has\u many、belish\u to等说明。检查一下:可能是您在追求has\u和\u belish\u to\u many,而不是更“现代”的作为完整对象连接。