2010-01-06 4 views
1

Я разрабатываю приложение Ruby on Rails, где одна из моих таблиц базы данных имеет 10 столбцов (от pile_1 до pile_10). Было бы удобно получить доступ к этим столбцам в модели как 10-элементный массив.Ruby on Rails: объединение нескольких столбцов в массив

Чувствую, что я могу уговорить composed_of делать то, что хочу, но не могу понять, как это сделать. Может ли кто-нибудь просветить меня или предложить лучшую тактику?

+0

Возможно ли изменить схему? –

+0

Да. Это личное развитие, поэтому я полностью контролирую его. – Chowlett

ответ

2

Поскольку у вас есть возможность изменить схему, вам необходимо. Хранение массива в виде отдельных столбцов в таблице - denormalized. Независимо от того, нормализована ли ваша схема, может ли это не иметь значения для вас, но ваша текущая трудность является прямым результатом денормализованной схемы.

Что вы должны сделать, так это создать новый стол, сваи, вот так. Я буду использовать синтаксис postgres, так как это то, что я знаю. Я не знаю, имя таблицы, которая в настоящее время содержит все сваи * колонны, так что я буду называть его «Foo»:

create table piles (
    id serial primary key, 
    foo_id int not null references foo(id), 
    value text not null, 
); 

Каждый столбец теперь у вас в обув существует вместо того, чтобы как строка в геморрой. В модели для свай, добавьте:

belongs_to: foo 

и в модели для обув, добавьте:

has_many: piles 

В контроллере, когда у вас есть Foo в руках, вы можете получить доступ к его сваям foo.piles

+0

Ну, я делаю это несколько, чтобы научить себя RoR, поэтому я должен, вероятно, научиться правильно и сделать это так (хотя решение Фаррела заманчиво в простоте). Что было бы лучшим способом захватить входные значения для объектов Piles на странице создания Foo, в данном случае? form_for (@foo) предположительно не будет просто работать; мне нужен цикл через <% для @pile в @ foo.piles%>, создавая

s в моей форме_for? Я не могу понять правильный синтаксис. ... Должен ли я создавать новый вопрос для этого? – Chowlett

+0

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

6

бы

def piles 
    (1..10).map{ |num| self[ "pile_#{ num }"]} 
end 

не хватает?

+0

Hah. Это аккуратно. В этом случае, да, это должно делать все, что мне нужно, потому что я не ожидаю, что вам понадобится/write/to piles_n в любой момент. Предположительно модель. [] () - это метод ActiveRecord :: Base? – Chowlett

+1

Для ясности вы можете использовать read_attribute ("pile _ # {num}") вместо этого, но аксессуар с квадратными скобками функционально схож. – tadman

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

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