Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将更新保存到rails中的对象_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on 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

我试图在rails应用程序中更新我的一个对象,但更改不起作用。没有错误,使用调试器只会显示它认为所有内容都在更新

不管怎样,这是有问题的代码

  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,而不是更“现代”的作为完整对象连接。