rails 模型方法只是说 nil

rails model method is just saying nil

这几乎是我在 model 中的第一个方法,所以我认为我在这里遗漏了一些非常基本的部分。但是我2个小时都找不到问题所在。你的帮助将拯救我!

# just simple UserKey(to find user rapidly) model
class UserKey < ActiveRecord::Base

def filter_name(name)
  self.where("name LIKE ?", "%#{name}%")
end

然后我在 rails 控制台中执行 @user_key.filter_name("jeongbin"),它只是说 nil,即使我在 user_keys table 中保存了 jeongbin。当我在我的控制台中使用 @user_key.where("name LIKE ?", "%jeongbin%") 执行此操作时,它正在运行!

我认为我的知识不足,缺少一些基本部分。任何建议都会对我有很大帮助。

修改方法为:-

def self.filter_name(name)
  self.where("name LIKE ?", "%#{name}%")
end

在 rails 控制台中,搜索用户为:-

UserKey.filter_name("jeongbin")

def filter_name(name) 将在 UserKey model 的对象上调用,因此在使用 @user_key 调用时显示结果,因为 "jeongbin" 存在于该对象中,否则它是零。

但是要搜索 user_keys table 中的所有记录,应该用 UserKey Model 调用,方法应该是 class 方法,如 def self.filter_name(name)

您似乎放错了地方 self

class UserKey < ActiveRecord::Base

  def self.filter_name(name)
    where 'name LIKE ?', "%#{name}%"
  end

end

我通常更喜欢这种表示法,以完成同样的事情,因为它将所有内容组织到一个位置,并随着代码库的增长减少 self. 的数量。

class UserKey < ActiveRecord::Base

  class << self

    def filter_name(name)
      where 'name LIKE ?', "%#{name}%"
    end

  end    
end

你需要这样称呼它

UserKey.filter_name 'some_name'

如果您想将其保留为实例方法,请使用:

class UserKey < ActiveRecord::Base

  class << self

    def filter_name(name)
      where 'name LIKE ?', "%#{name}%"
    end

  end   


  def filter_name(name) 
    self.class.filter_name(name) 
  end

end