首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DataMapper first_or_create不工作...你知道为什么吗?

DataMapper first_or_create不工作...你知道为什么吗?
EN

Stack Overflow用户
提问于 2011-07-07 09:15:21
回答 2查看 1.2K关注 0票数 0

好吧,我终于决定我没疯了。那就只剩下DataMapper了。

这就是我要做的。我有一个模型运行的has 1公制。

代码语言:javascript
运行
复制
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,并按照它显示的方式工作。这是非常艰巨的。谢谢你的帮助。

更新:

我还是搞不清楚到底是怎么回事,但为了证明我没疯...

代码语言:javascript
运行
复制
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不仅没有提供我所期望的行为

代码语言:javascript
运行
复制
def first_or_create(conditions = {}, attributes = {})
  first(conditions) || create(conditions.merge(attributes))
end

但它也不是在创造。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-07 12:01:54

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

代码语言:javascript
运行
复制
.first_or_create(msrun_id: tmp.id).update(metric_input_file: @metricsfile)

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

代码语言:javascript
运行
复制
m = Metric.first_or_new(msrun_id: tmp.id)
[set..save..assign]

但是如果它不是在新型号上设置的,我看不出是什么导致了到目前为止发布的代码,更多..?

已更新

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

代码语言:javascript
运行
复制
DataMapper::Model.raise_on_save_failure = true

不幸的是,抛出的异常永远不会告诉你为什么(在地狱里有一个特殊的地方可以选择,就在剧院里说话的人旁边)。但它通常是以下几种之一:

如果你想发布你的模型定义,这个问题可能是可以发现的。

票数 3
EN

Stack Overflow用户

发布于 2012-01-04 15:28:16

除了上面的答案之外,我还看到这个调用死掉了(就像从字面上停止所有执行),当我在做一个find_or_create时,它会创建一个违反主键约束的对象,而没有任何错误。这是因为datamapper模型与实际的数据库架构不同步。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6604814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档