2015-01-18 2 views
0

Это почти мой первый метод в модель, поэтому я думаю, что здесь отсутствует какая-то очень фундаментальная часть. Но я не мог понять, в чем проблема в течение 2 часов. Ваша помощь спасет меня!рельсы модель метод просто говорит nil

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

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

Тогда я @user_key.filter_name("jeongbin") в моей рельсах консоли, и это просто говорит ноль, даже если я сохранил jeongbin в моей таблице user_keys. Когда я просто делаю это с @user_key.where("name LIKE ?", "%jeongbin%") в моей консоли, он работает!

Я думаю, что у моего плохого знания отсутствуют некоторые основные части. Любые советы мне очень помогут.

ответ

0

Изменить метод, как: -

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

В рельсах консоли, поиск пользователя, как: -

UserKey.filter_name("jeongbin") 

def filter_name(name) будет называться на объект UserKey model, поэтому он показывает результат, когда он вызывается с @user_key, так как "jeongbin" есть в этом объекте, иначе он равен нулю.

Но искать по всей записи в user_keys table, он должен быть звонить с UserKey Model и метод должен быть метод класса, как def self.filter_name(name).

+0

О, я не знал, что самость связана с UserKey (а не с моими переменными типа @user_key). Также с вашим комментарием я расскажу, что я сделал метод с тем же именем (большая ошибка). Но я мог бы снова подумать о себе и моделировать и узнать. Спасибо! –

1

Похоже, у вас есть неуместное 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 
+0

Ты сделал мне огромный совет! (Я видел твой ответ после того, как я принял ответ @Shamsul Haque). Я не знал точно об этом, просто некоторые небольшие знания с других сайтов. Но это очень ясно с вашим комментарием и Большой урок для меня! Спасибо огромное! –

+0

О, также я не знал, что предложение where может быть использовано без чего-либо раньше. Благодаря! –

+0

Добро пожаловать. FWIW, вам очень редко нужно «я». 2 наиболее распространенных случая, вероятно, для класса, как и в моем примере, и для назначения атрибута (например, 'self.some_attribute = 'some_value''. В противном случае вы можете просто попробовать пропустить его для стартеров. –

Смежные вопросы