【问题标题】:Calling External Model Methods in Rails在 Rails 中调用外部模型方法
【发布时间】:2013-01-20 20:02:49
【问题描述】:

我有两个模型,AB 其中A has_many B

A 模型中,我有一个公共方法循环遍历所有关联的B 对象并更新每个对象中的数据库字段。我想拥有B 中的方法并只运行A 中的循环,但它们似乎没有正确保存。这种方法有问题吗?

这里是方法的一个例子:

def update_fields # A Method
  self.b.each do |b|
    b.b_method
  end
end

def b_method # B Method
  self.field = '5'
  self.save
end

运行此类代码,不会将任何内容保存到数据库中,并且输出不会更新。

我怎样才能完成这种事情?或者,是否所有逻辑都需要在 A 控制器中,即使它正在处理 B 字段?

【问题讨论】:

  • 您可能只是仔细检查save 没有返回false。如果是,则可能只是某些验证失败。一般的方法当然没有错。

标签: ruby-on-rails ruby-on-rails-3 models


【解决方案1】:

如果 a belongs_to b 那么 a 只有一个 b - 所以你尝试在 a 方法中迭代多个 b 是没有意义的。

编辑

你不需要“自我”。如果您调用即时方法。 self 用于声明类方法。

但最让我困惑的是,你试图在模型中保存一些东西。属于控制器!

【讨论】:

  • 使用 self 是良性的,因为 Ruby 对待它们是一样的,但只是为了看看,我删除了它,但什么也没发生。此外,在这种情况下,不会从表单字段中保存任何内容,这是一个 JSON 更新,需要通过 Rake 任务定期进行。这就是它在模型中而不是控制器中的原因。
【解决方案2】:

尝试使用 update_attributes

def update_fields
  b.each { |x| x.update_attributes(field: "5") }
end

或者

def b_method
  update_attributes(field: "5")
end

【讨论】:

  • 我试过 update_attributes 并没有改变。但是,我确实将所有逻辑移到了 B 模型中,并且它运行顺利,所以它让我相信 save 不是问题。
【解决方案3】:

最终导致验证出现问题,因此通用方法奏效了。

【讨论】:

    猜你喜欢
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 2013-04-28
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多