0

Я использую Rails 4.2.7. У меня есть атрибут в моей модели, которая не имеет поля базы данных под нимВ RoR, как мне инициализировать поля в моей модели на основе поля в моей модели, у которого нет базового столбца базы данных?

attr_accessor :division 

Это инициализируется при создании нового объекта.

my_object = MyObject.new(:name => name, 
         :age => get_age(data_hash), 
         :overall_rank => overall_rank, 
         :city => city, 
         :state => state, 
         :country => country, 
         :age_group_rank => age_group_rank, 
         :gender_rank => gender_rank, 
         :division => division) 

То, что я хотел бы, когда это поле получает значение (если оно не ноль), для двух других полей, которые имеют отображение в базе данных, чтобы установить. Другие поля будут подстроками поля «деление». Где я могу поставить эту логику?

+0

Вы просматривали обратные вызовы Active Record? например, 'after_initialization'? вы можете написать обратный вызов, который проверяет значение этого поля и устанавливает другие два на этом этапе. –

+0

Могу ли я определить метод «after_initialization» в моей модели? Я не вижу этого в документации Rails. –

+0

Вот рекомендации по рельсам с использованием обратных вызовов: http://guides.rubyonrails.org/active_record_callbacks.html Стоит прочитать - они очень полезны :) –

ответ

0

Я вижу несколько вариантов здесь Вы можете добавить его в ваш контроллер следующим

def create 
    if params[:example][:division] 
    # Set those params here 
    end 
end 

Или вы можете использовать before_save В модели

before_save :do_something 

def do_something 
    if division 
    # Here! 
    end 
end 
+0

Вам нужно сделать «если деление! = Ноль»?Не могли бы вы просто «разделить» вместо этого? –

+0

Да, конечно. , , , , , , , , , –

1

я бы, вероятно, падение attr_accessor :division и сделайте это вручную с помощью:

def division=(d) 
    # Break up `d` as needed and assign the parts to the 
    # desired real attributes. 
end 

def division 
    # Combine the broken out attributes as needed and 
    # return the combined string. 
end 

С этими двумя встречными HODS на месте, следующий будет все называть division=:

MyObject.new(:division => '...') 
MyObject.create(:division => '...') 
o = MyObject.find(...); o.update(:division => '...') 
o = MyObject.find(...); o.division = '...' 

так division и разбитые атрибутов всегда согласуются друг с другом.

Если вы попытаетесь использовать один из крючков жизненного цикла (например, after_initialize), тогда все может выйти из строя. Предположим, что division имеет форму 'a.b', а разбитые атрибуты: a и b и предположим, что вы используете один из крючков ActiveRecord для разбивки division. Потом сказал:

o.division = 'x.y' 

должно дать вам o.a == 'x', но это не потому, что крючок не выполнил еще. Точно так же, если вы начинаете с o.division == 'a.b' затем

o.a = 'x' 

не дадут вам o.division == 'x.b' около того атрибутов будут выпали из синхронизации снова.