CamelCase вместо snake_case в БД Rails - PullRequest
5 голосов
/ 12 мая 2011

Мои таблицы БД и имена полей находятся в CamelCase.Можно ли конвертировать эти имена в snake_case на лету?Чтобы методы модели выглядели красиво?

Приложение - JRubyOnRails 3.0 / MSSQL DB / ActiveRecord-JDBC-адаптер.

Ответы [ 4 ]

5 голосов
/ 13 мая 2011

@ arkadiy, по сути, я изучал это как раз в тот же день.

Для имен таблиц у нас, конечно, есть метод set_table_name:

class CamelCasedFoo < ActiveRecord::Base
  set_table_name :CamelCasedTable
end

Для таких вещей, как первичные ключи, у нас есть set_primary_key:

class CamelCasedBar < ActiveRecord::Base
  ...
  set_primary_key "CamelCasedTableID"
end

И должно быть возможно присвоить псевдонимы в стиле фанк, унаследованные имена столбцов для чего-то более рельсового-дружественный с alias_attribute:

class CamelCasedBaz < ActiveRecord::Base
  ...
  alias_attribute :preferred_delivery, :DeliveryFrequency
end

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

Похоже, что Rails обладает всеми этими качествами метапрограммирования, позволяя вам работать с устаревшими именами таблиц БД и столбцами.Возможно, вы захотите прочитать сообщение в блоге Джонатана Хуэя по "Модель Ruby on Rails 3, работающая с устаревшей базой данных" .И вы можете захотеть взглянуть на safe_attributes gem.

1 голос
/ 02 апреля 2014

У меня была такая же потребность.Ответ @ buruzaemon об установке table_name и primary_key хорош, но у меня есть несколько предложений, чтобы сделать его лучше.

Я считаю, что методы стиля set_ * потеряли популярность, и в эти дни рекомендуется просто установить атрибут напрямую.,Так что

class Project < ActiveRecord::Base
  self.table_name = 'Projects'
  self.primary_key = 'ProjectId'
end

Кроме того, использование alias_attribute для ручного псевдонима каждого атрибута кажется утомительным.Также кажется, что можно легко забыть один.Хотя @Behrangf рекомендует против этого, я не вижу ничего плохого в использовании небольшого волшебства метапрограммирования для автоматического предоставления версии ваших атрибутов в snake_case. Я создал модуль , который делает это автоматически.Он даже не привязан к ActiveRecord, поэтому вы также можете использовать его в оболочке API или в чем-то еще, что отражает систему, которая не следует соглашениям Ruby.Я отслеживаю модуль в Gist, но для удобства он воспроизводится ниже:

module Snakeable

  # Patch in our automatic snake_case methods
  def method_missing method, *args 
    if is_snake_case?(method) &&
      respond_to?(camelized = method.to_s.camelize.to_sym)
      send camelized, *args
    else
      super
    end
  end

  # So the object including this module will respond to
  # Object#respond_to? correctly
  def respond_to? method, *args
    super || (
      is_snake_case?(method) &&
      super(method.to_s.camelize.to_sym, *args)
    )
  end

  private

  # Is the given method using the snake_case format
  def is_snake_case? method
    method.to_s =~ /^[a-z]+(?:_[a-z]+)*[?=!]?$/
  end

end

Этот модуль зависит от метода ActiveSupport camelize.

0 голосов
/ 13 мая 2011

Ruby on Rails - это верное программное обеспечение . Это означает, что его дизайнеры решили делать что-то определенным образом, и чтобы иметь возможность использовать RoR с успехом, удовольствием, легкостью, плавностью и т. Д. Вы должны делать это именно таким образом. Поэтому, если вы не можете или не хотите следовать правилам именования таблиц и столбцов RoR, рекомендуется выбрать другую платформу.

Однако, если вы хотите остаться с RoR, но вам нужны snake_case имена методов, вы можете открыть класс ActiveRecord::Base, перехватить вызовы неопределенных методов, убедиться, что они соответствуют обычному исключению ^[a-z]+(_[a-z]+)*$, и если да, преобразовать их в верхний регистр и вызвать метод верхнего регистра. НО Я НАСТОЯТЕЛЬНО СОВЕТУЮ ВАМ ЭТОГО НЕ СДЕЛАТЬ !!! *: D

0 голосов
/ 13 мая 2011

Тьфу!Вы имеете мое сочувствие.Мне нравятся old_school.names все время, даже когда движок учитывает другие маляры ...

Я предполагаю, что это устаревшее приложение?

Как насчет создания набора представлений для ваших рельсовприложение для работы?

...