2014-02-20 5 views
0

Кто-нибудь знает, как Rails заказывает атрибуты модели изначально?Собственный заказ атрибутов модели

Мой вопрос заключается в следующем:

У меня есть модель я использую в течение длительного времени под названием Device. В devices/show.html.erb я показываю свои атрибуты, используя что-то вроде:

<% @device.attributes.each do |k,v| %> 
    <tr> 
    <td><%= k %></td> 
    <td><%= v %></td> 
    </tr> 
<% end %> 

Я решил добавить атрибут, который связан с 5-го атрибута в атрибутах модели, но при запуске миграции create_column для него, по-видимому в конце этого списка (так как это последний атрибут, который нужно добавить).

Я подозреваю, что Rails заказывает свои атрибуты по времени создания столбца, так как я попытался переместить столбец в нужное место в моей базе данных и объявить атрибут раньше в моем списке attr_accessible, но безрезультатно. Перемещение столбца в schema.rb и восстановление базы данных, вероятно, будут работать, но этого я не могу сделать. Я мог бы взломать его в нужное место в представлении, но мне интересно, есть ли лучшее решение в первую очередь.

Есть ли способ, которым я могу это сделать без принудительного упорядочения по всему списку атрибутов?

+3

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

+0

Ой, имея что-то зависящее от n-й позиции столбца, звучит как действительно плохая идея. Как вы заметили, вы не можете гарантировать порядок/позицию (не без большого количества обезьян, и даже тогда я не буду на это полагаться). Я думаю, вам лучше описать конкретный сценарий, который вы пытаетесь выполнить с этим заказом; мы, вероятно, можем помочь вам найти гораздо более безопасное решение. –

+0

Я не собирался полагаться на какое-либо упорядочение атрибутов этой модели (за исключением согласованности с представлением), поэтому я не особо беспокоился о том, чтобы быть во власти решений по упорядочению атрибутов, принятых конкретными версиями. Очевидно, что это (очень немного) изменилось, поэтому я представлю для этого представление для представления. Спасибо – ricky116

ответ

1

Как насчет делать что-то вроде этого:

1- Получить COLUMN_NAMES (если вы не хотите, чтобы сделать это вручную)

column_names = Device.column_names.inject([]) { |arr,e| arr.push(e) } 

2- Изменение порядка, что вы хотите (то есть, имя столбца, что вы заботитесь о)

3- Оценка каждого на @device

column_names.each_with_object({}) { |m, hash| hash[m] = @device.send(m) } 
1

Rails миграции позволяет указать, где добавить столбец с опцией :after:

add_column :your_table, :column_name, :data_type, after: :related_column 

Это может помочь. Но, поскольку это касается представления, я бы заказал атрибуты в помощнике.

+1

AFAIK опция ': after' зависит от базы данных и является MySQLism. –

+0

Спасибо за то, что вы это заметили :-) +1 – Abdo

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