2013-12-20 3 views
1

это мой вопрос.Как ActiveRecord находит атрибуты модели?

Я хочу знать, как active record доступ к таблицам и столбцам в базе данных?

+0

Вы можете лучше объяснить свой вопрос? как то, что именно вы хотите знать. –

+0

Я хочу знать, как модель находит столбец таблицы –

+0

http://www.martinfowler.com/eaaCatalog/activeRecord.html посмотреть, поможет ли это вам понять –

ответ

0

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

посмотри на http://guides.rubyonrails.org/active_record_basics.html

+0

привет .. может указать, где именно код написал для этого? –

+1

@poojaagarwal [здесь] (https://github.com/rails/rails/blob/master/activerecord/lib/active_record/model_schema.rb#L213), я думаю. – Mischa

+0

Спасибо за ссылку @Mischa. –

0

ActiveRecord обеспечивает базовый класс, который при подклассе устанавливает сопоставление между указанным классом и существующей таблицей БД.

Каждый метод поиска позволяет передавать в него аргументы для выполнения определенных запросов в вашей базе данных без записи необработанного SQL.

Если вы ищете больше на внутренней работе, вот хорошее место, чтобы начать: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/base.rb

3

Большинство кода, который отвечает на Ваш вопрос содержится в файле model_schema.rb.

table_name - название таблицы базы данных, соответствующей вашей модели. Как поясняется в документации, это догадывается из имени модели, если явно не задано.

угадывает имя таблицы (в принудительном строчными) на основе имени класса в иерархии наследования нисходящем непосредственно от ActiveRecord :: Base. Итак, если иерархия выглядит так: Reply < Message < ActiveRecord::Base, то сообщение используется , чтобы угадать имя таблицы даже при вызове Ответить. Правила, используемые для гадания , обрабатываются классом Inflector в Active Support, который знает почти все распространенные английские перегибы . Вы можете добавить новые перегибы в config/initializers/inflections.rb.

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

class Mouse < ActiveRecord::Base 
    self.table_name = "mice" 
end 

В качестве альтернативы, вы можете переопределить метод имя_таблицы, чтобы определить свое собственное вычисления. (Возможно, с помощью супер манипулировать имя таблицы по умолчанию .) Пример:

class Post < ActiveRecord::Base 
    def self.table_name 
    "special_" + super 
    end 
end 

Для колонн, это немного сложнее. Вы можете начать с метода columns, который извлекает определение столбца из файла schema.rb и возвращает их.

Столбцы явно указаны в файле schema.rb внутри вашего приложения.

+3

Это блестящий ответ на ужасный вопрос – Yule

+0

приятный и супер ответ. Большое спасибо –

+1

он не тянет из файла schema.rb, хотя (у меня есть проекты с пользовательскими столбцами db, которые просто сбрасывают sql). Обычно он использует интроспекцию таблицы через вызовы БД (например, см. Activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb и def column_definitions для того, как это делает postgresql. – Doon

0

Возьмите mysql в качестве примера, у него есть db call information_schema, и есть таблицы имен таблиц, столбцы и так далее. Mysql использует эти таблицы для хранения информации о каждой таблице и ее определении столбца в других базах данных mysql.

У другого db provicer может быть что-то похожее на это.

0

Он использует самоанализ. Если вы просматриваете журналы отладки, при первом обращении к модели вы должны увидеть запрос, определяющий определение таблицы, столбцы и т. Д. Я больше всего знаком с postgres, поэтому я свяжусь с этим, но все connection adapters сделайте это является специфичным для БД способом.

посмотрите на activerecord/lib/active_record/connection_adapters для вашей базы данных и вместе с функцией column_definitions, которая генерирует интроспекцию времени выполнения для postgres, это выглядит так.

(от https://github.com/rails/rails/blob/60fa355790bd6888ab8758bd4989431256d8ba8e/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb)

def column_definitions(table_name) #:nodoc: 
      exec_query(<<-end_sql, 'SCHEMA').rows 
       SELECT a.attname, format_type(a.atttypid, a.atttypmod), 
        pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod 
       FROM pg_attribute a LEFT JOIN pg_attrdef d 
        ON a.attrelid = d.adrelid AND a.attnum = d.adnum 
       WHERE a.attrelid = '#{quote_table_name(table_name)}'::regclass 
       AND a.attnum > 0 AND NOT a.attisdropped 
       ORDER BY a.attnum 
      end_sql 
     end 

Эта информация затем кэшируется и используется для создания динамических методов.

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

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