DataMapper first_or_create不起作用......任何想法为什么?

时间:2011-07-07 01:15:21

标签: ruby datamapper

好吧,我终于决定我不疯了。因此,这留下了DataMapper。

这就是我正在做的事情。我有一个模型Msrun has 1 Metric。

tmp = Msrun.first_or_create # I'll skip the boring details
tmp.metric = Metric.first_or_create( {msrun_id: tmp.id}, {metric_input_file: @metricsfile} )
p tmp.metric # => #<Metric @metric_input_file=nil @msrun_id=1>
tmp.metric.metric_input_file = @metricsfile
p tmp.metric # => #<Metric @metric_input_file=#<Pathname:/home/ryanmt/Dropbox/coding/rails/metrics_site/spec/tfiles/single_metric.txt> @msrun_id=1>

那么,为什么这不起作用?我正在阅读http://datamapper.org/docs/create_and_destroy并做它显示的工作。这非常艰巨。谢谢你的帮助。

更新:
我仍然无法弄清楚发生了什么,但要证明我不是疯了......

puts Metric.all # => []
tmp.metric = Metric.first_or_create( {msrun_id: tmp.id}, {metric_input_file: @metricsfile} )
puts Metric.all # => [] #??????????????
tmp.metric.metric_input_file = @metricsfile
p tmp.metric # => #<Metric @metric_input_file=#<Pathname:/home/ryanmt/Dropbox/coding/rails/metrics_site/spec/tfiles/single_metric.txt> @msrun_id=1>
tmp.metric.save
puts Metric.all # => [#<Metric @metric_input_file=#<Pathname:/home/ryanmt/Dropbox/coding/rails/metrics_site/spec/tfiles/single_metric.txt> @msrun_id=1>]

因此,first_or_create不仅没有通过阅读源

来实现我期望的行为
def first_or_create(conditions = {}, attributes = {})
  first(conditions) || create(conditions.merge(attributes))
end

但它甚至没有创造。

2 个答案:

答案 0 :(得分:3)

我可能在这里遗漏了一些东西(更多那些无聊的细节可能会有所帮助)但是如果指标存在,那么它的metric_input_file不应该更新,即它只在新的时候设置。如果你正在更新,那么你可以做

.first_or_create(msrun_id: tmp.id).update(metric_input_file: @metricsfile)

或者如果没有两次访问数据库是相关的,那么

m = Metric.first_or_new(msrun_id: tmp.id)
[set..save..assign]

但是如果它没有在新模型上设置,我看不到会导致到目前为止发布的代码的原因,更多......?

[增订]

根据你的新代码,我会说这是假DM保存的“经典案例”。我通常将以下行添加到初始化部分,例如Rails中的application.rb。

DataMapper::Model.raise_on_save_failure = true

不幸的是,所引发的例外从未告诉你为什么(在地狱中有一个特殊的地方可供选择,就在那些在影院上讲话的人旁边。)但它通常是以下之一:

  • 稍微不正确的关联定义
  • a has / belongs_to不是“required:false”且未设置
  • 将错误的数据类型放入字段中,例如,将字符串转换为小数
  • 验证失败

如果您想发布模型定义,可能会在那里发现问题。

答案 1 :(得分:0)

除了上面的答案,我还看到这个调用死了(比如,字面上停止所有执行),当我做一个会创建违反主键约束的对象的find_or_create时没有错误。这是因为datamapper模型与实际数据库模式不同步。

相关问题