2013-10-28 2 views
0

В моей модели Rails У меня есть description метод:Рубин на Rails - Имя методы Идентичного метод ActiveRecord

def description 
    if self.channels.nil? 
    return self.allowed_ip_addresses 
    else 
    return self.channels.to_s + ' channels - ' + self.allowed_ip_addresses 
    end 
end 

У меня есть довольно много моделей, где я создал description метод, который возвращает некоторую полезную информацию, основанную на другие свойства этой модели.

Проблема, которую я только что понял, состоит в том, что в этой модели есть столбец description, поэтому я просто задавался вопросом, как наилучшим образом решить эту проблему, я огляделся, но не нашел ничего полезного.

Первое, о чем я думал, это передать аргумент при вызове description, например.

def description(table_value = 0) 
    if table_value 
    return self.description 
    end 

    if self.channels.nil? 
    return self.allowed_ip_addresses 
    else 
    return self.channels.to_s + ' channels - ' + self.allowed_ip_addresses 
    end 
end 

, но вскоре понял, что это бессмысленно, так как это будет просто вызвать метод description рекурсивно и умереть (при условии 1 передается с вызовом description).

Я также могу изменить имя столбца таблицы, но он используется в другом месте, поэтому я просто пытаюсь посмотреть, есть ли альтернативное решение.

+0

Используйте метод read_attribute из модели, чтобы заставить его получить метод БД. Вы также можете использовать 'super'. – mjnissim

ответ

0

Ruby имеет концепцию «супер», которая позволяет вам вызывать методы в родительских классах или модулях. В Rails Active Record позволяет воспользоваться этим, переопределив «метод столбцов» и добравшись до значения базы данных, вызвав super. Это не совсем ясно из вашего вопроса, при каких условиях вы хотите использовать значение базы данных и когда хотите использовать пользовательскую логику. Вот несколько псевдокодов, которые помогут вам начать работу:

def description 
    return super if Use Database Value? 

    if self.channels.nil? 
    return self.allowed_ip_addresses 
    else 
    return self.channels.to_s + ' channels - ' + self.allowed_ip_addresses 
    end 
end 
+0

ах, отлично, большое спасибо. Я надеялся, что будет что-то Rails-я мог бы сделать, но просто не мог его найти. – martincarlin87

+0

@ martincarlin87 если это сработает для вас, пожалуйста, примите ответ, чтобы другие знали, что на ваш вопрос был дан ответ. –

+0

yip, я всегда согласен, что вы так быстро ответили, что мне пришлось подождать несколько минут (думаю, ответы могут быть приняты только через 7 минут) – martincarlin87

2

Я бы определенно переименовал ваш пользовательский метод description.

+1

или столбец, в зависимости от того, что проще или более подходит для согласованности в вашей заявке – Matt

+0

Я согласен, что, вероятно, это будет лучше всего, но мне нужно сделать переопределение только в одном месте по сравнению с количеством изменений, которые я сделал бы необходимо сделать, если я переименовал столбец или метод пользовательского описания. – martincarlin87

+3

@ martincarlin87 Я думаю, что переименование стоит приложить усилия в нем. Если вы сделаете больше таких хаков, ваш код скоро будет выглядеть как дерьмо. –

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

  • Нет связанных вопросов^_^