【问题标题】:Treacherous ActiveRecord behavior?危险的 ActiveRecord 行为?
【发布时间】:2010-12-10 06:36:25
【问题描述】:

我有一个带有 vote 方法的 Post 类,该方法创建了一个 Vote 实例

这行不通

def vote(options)
   vote = self.votes.create(options)
   return vote if vote.valid?
   nil
end 

这确实有效

def vote(options)
   options[:post] = self
   vote = self.votes.create(options)
   return vote if vote.valid?
   nil
end 

.create 调用不应该自动添加 :post 关联吗?

澄清

类发布<:base has_many>

类投票 true 属于_to :post 结束

【问题讨论】:

  • 怎么不行?需要进一步解释。

标签: ruby-on-rails rails-activerecord


【解决方案1】:

你有吗

has_many :votes

在您的 Post 模型中声明?

你在对象生命周期的什么时候调用了 vote 方法?它是回调方法的一部分吗?

【讨论】:

  • 我在对象创建(并保存)后调用 vote 方法。投票方法调用不是回调的一部分。
  • 如果没有 has_many :votes 而不是 self.votes.create 在这两种情况下都会导致错误。
  • @Alexandre 如果您在创建对象后调用投票,为什么它会创建一个新对象?
  • @EmFi 对不起,我不明白你的问题。创建新对象时创建了哪个对象?
  • 如果您提供更多模型代码和用于在控制台中测试的命令,也可能会更容易。
【解决方案2】:

如果你把它写成self.votes.create!(options) 会更容易调试,因为这样它会抛出一个带有错误消息的异常。解决问题后,您可以将其删除,但您应该考虑如果方法不起作用,您的方法应该返回什么。

Post#vote 返回nil 有意义吗?为什么投票会失败?你的代码如何处理Post#vote返回的nil值?

也许你应该把它重写为:

def vote(options)
  self.votes.create!(options)
end

【讨论】:

  • 如果用户已经投票,则返回 nil,此时投票无效。
  • 好的。你有没有尝试切换到创建!看看 ActiveRecord 的错误是什么?
猜你喜欢
  • 1970-01-01
  • 2012-01-13
  • 2018-09-04
  • 1970-01-01
  • 2015-03-08
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多