Ruby:从find_by对象调用self.method

时间:2015-04-17 20:36:22

标签: ruby-on-rails ruby self

我在尝试使用find_by(id)获取对象后调用self.method

app.get()的路线创建中的代码:

userFound = Models::Persistence::User.find_by(:auth_id => authid)
result = Models::Persistence::User.new
result = userFound
puts result.class
puts userFound.class 
return result.to_json 

self.method函数在Models :: Persistence :: User中定义。谁能告诉我为什么不调用self.transformToApiValue()? 我试过的事情: 在Debug中更多代码,看看是否正在访问self.method。 Tunrs out it没有。

如果不清楚/我需要发布更多代码段,请告诉我。

Edit1:用户模型中的自我功能只是删除了oid等以供客户端查看

  def self.transformToApiValue(key, val)
    val = super(key, val)
    if (key == 'useractivity')
      newVal = []
      val.each { |useractivity|
        if useractivity != 'course'
          newBlock = Models::Persistence::Useractivity.parseForClient(useractivity)
          newVal.push(newBlock)
        end
      }
      val = newVal
    end
    return val
  end

上面的函数允许在将JSON转换为客户端值时自定义JSON中的useractivity属性。

1 个答案:

答案 0 :(得分:2)

听起来你在轨道上假设有太多魔法。

self.method是一种类方法。这意味着要调用它,你必须在控制器或其他模型中明确地运行它

Models::Persistence::User.transformToApiValue(your_key, your_val)

根据你提到的内容,这可能不是你想要的。您想要进行回调,在保存之前设置该值。因此,在您的用户模型中,您将添加

before_save :transform_api_value

然后在相同的模型中定义

def transform_api_value
  attribute_you_are_editing = Models::Persistence::User.transformToApiValue(value_you_are_transforming)
end

然后,它将在保存之前运行转换并正确保存用户属性。您必须更新transformToApiValue。我第一次读它时代码很难遵循,但我希望这有助于你理解这个概念。

想要补充说这里有一些问题,例如你可能不想在每次保存时都这样做,你可能想在创建时这样做。我建议阅读回调指南,以确定您的业务逻辑如何适合这一点。 http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html