2015-02-25 2 views
0

Скажем, у меня есть класс Foo. Один из столбцов Foo's называется bars. Я хочу, чтобы bars разделил его содержимое text на ,, создав массив. Таким образом, "this, to, array" - ["this","to" ,"array"]. По какой-то причине после создания нового экземпляра FooFoo.last.bars по-прежнему возвращает bars как String. У меня есть чувство моего метода bars_to_array.Сохранить объект ActiveRecord как массив - Rails 4

у меня есть:

Foo Класс:

class Filter < ActiveRecord::Base 
    ... 
    def bars_to_array 
    bars.split(',') 
    save 
    end 
    ... 
end 

Foo в Migraiton:

class CreateFoos < ActiveRecord::Migration 
    def change 
    create_table :foos do |t| 
     ...  
     t.text :bars 
     ... 
    end 
    end 
end 

FOOS # создать:

def create 
    ... 
    @foo = Foo.new 
    @foo.bars_to_array 
    ... 
end 

EDIT 1:

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

+0

Вы действительно хотите сохранить данные в виде массива или просто разбить его после прочтения его из столбца? – nPn

+0

@nPn Спасибо за это. Я забыл упомянуть, что я знаю метод 'seriazlie', но я хочу разбить текст на' array' после сохранения объекта. –

+0

, то просто переместите сохранение __before__ bars.split (',') – nPn

ответ

0
class Filter < ActiveRecord::Base 
    serialize :bars, Array 
end 
+0

не могли бы вы объяснить свой ответ? – shivam

0

Метод bars.split (',') не изменяет строку, просто возвращает массив. Вы отбрасываете возвращаемый массив.

Edit:

Вы можете использовать «Serialize», или вы могли бы сделать два метода:

def bars= value 
    serialized_bars = value.join(',') 
end 

def bars 
    serialized_bars.split(',') 
end 

alias_attribute :serialized_bars, :bars 
+0

имеет смысл. Как изменить экземпляр «Foo», который сохраняется тогда? –

+0

Вы можете использовать 'Serialize', или вы могли бы сделать два метода: DEF бруски = значение serialized_bars = value.join ('') концевые Защиту бары serialized_bars.split (',') конец alias_attribute: serialized_bars,: bars – eritiro

0

Если то, что вы пытаетесь сделать, чтобы иметь метод баров всегда просто возвращает строку, вы сохраняете в текстовом столбце массив (разделяете запятую), а затем делаете следующее.

Добавьте к вашей модели следующий метод. Это переопределит метод баров. Он прочитает фактический столбец, затем выплюнет его запятой и извлечет массив.

Вам не нужен ваш метод bar_to_array, данные будут храниться как строка, но всегда будут возвращаться в виде разделенного массива.

def bars 
    read_attribute(:bars).split(',') 
end 
+0

Я играю с этим в консоли, делая 'Foo.create (бары:« Разделить эту мать »)', а затем вызывая 'Foo.last .bars_to_array'. 'Foo.last.bars' все еще возвращает' String'. –

+0

метод баров просто вернет фактический столбец (строка). – nPn

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