это мой вопрос.Как ActiveRecord находит атрибуты модели?
Я хочу знать, как active record
доступ к таблицам и столбцам в базе данных?
это мой вопрос.Как ActiveRecord находит атрибуты модели?
Я хочу знать, как active record
доступ к таблицам и столбцам в базе данных?
Это делается ОРМ слой и соответствует соглашению рельсов для отображения таблицы и там поля, пока вы вручную настроить модель для отображения таблицы в базе данных
посмотри на http://guides.rubyonrails.org/active_record_basics.html
привет .. может указать, где именно код написал для этого? –
@poojaagarwal [здесь] (https://github.com/rails/rails/blob/master/activerecord/lib/active_record/model_schema.rb#L213), я думаю. – Mischa
Спасибо за ссылку @Mischa. –
ActiveRecord обеспечивает базовый класс, который при подклассе устанавливает сопоставление между указанным классом и существующей таблицей БД.
Каждый метод поиска позволяет передавать в него аргументы для выполнения определенных запросов в вашей базе данных без записи необработанного SQL.
Если вы ищете больше на внутренней работе, вот хорошее место, чтобы начать: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/base.rb
Большинство кода, который отвечает на Ваш вопрос содержится в файле 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
внутри вашего приложения.
Это блестящий ответ на ужасный вопрос – Yule
приятный и супер ответ. Большое спасибо –
он не тянет из файла schema.rb, хотя (у меня есть проекты с пользовательскими столбцами db, которые просто сбрасывают sql). Обычно он использует интроспекцию таблицы через вызовы БД (например, см. Activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb и def column_definitions для того, как это делает postgresql. – Doon
Возьмите mysql в качестве примера, у него есть db call information_schema, и есть таблицы имен таблиц, столбцы и так далее. Mysql использует эти таблицы для хранения информации о каждой таблице и ее определении столбца в других базах данных mysql.
У другого db provicer может быть что-то похожее на это.
Он использует самоанализ. Если вы просматриваете журналы отладки, при первом обращении к модели вы должны увидеть запрос, определяющий определение таблицы, столбцы и т. Д. Я больше всего знаком с postgres, поэтому я свяжусь с этим, но все connection adapters
сделайте это является специфичным для БД способом.
посмотрите на activerecord/lib/active_record/connection_adapters
для вашей базы данных и вместе с функцией column_definitions
, которая генерирует интроспекцию времени выполнения для postgres, это выглядит так.
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
.
Вы можете лучше объяснить свой вопрос? как то, что именно вы хотите знать. –
Я хочу знать, как модель находит столбец таблицы –
http://www.martinfowler.com/eaaCatalog/activeRecord.html посмотреть, поможет ли это вам понять –