好吧,我终于决定我不疯了。因此,这留下了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
但它甚至没有创造。
答案 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
不幸的是,所引发的例外从未告诉你为什么(在地狱中有一个特殊的地方可供选择,就在那些在影院上讲话的人旁边。)但它通常是以下之一:
如果您想发布模型定义,可能会在那里发现问题。
答案 1 :(得分:0)
除了上面的答案,我还看到这个调用死了(比如,字面上停止所有执行),当我做一个会创建违反主键约束的对象的find_or_create时没有错误。这是因为datamapper模型与实际数据库模式不同步。