Поскольку индексы MySQL уже не учитывают регистр, я предполагаю, что вы имеете дело с PostgreSQL, который по умолчанию создает индексы с учетом регистра. Я отвечаю здесь на основе Rails 3.2.3 и PostgreSQL 8.4.
Кажется, функциональные индексы - еще один пример того, что ActiveRecord не может генерировать. Внешние ключи и столбцы UUID - еще два, которые приходят на ум. Таким образом, нет выбора (кроме использования ActiveRecord для обезьян), но для использования execute
операторов.
Это означает, что для точного дампа вашей базы данных вам нужно отказаться от схемы агностиков DB. rb в пользу структуры DB-specific.sql. См. Руководство по Rails по переходам, раздел 6.2 Типы дампов схемы . Это устанавливается следующим образом:
config / application.rb
config.active_record.schema_format = :sql
db / structure.sql следует обновлять автоматически при выполнении миграции. Вы можете сгенерировать его вручную с помощью этой команды:
rake db:structure:dump
Файл является чистым Postgres SQL. Несмотря на то, что вы не указали, когда используете rake -T
для списка задач рейка, кажется, что вы можете использовать эту команду для загрузки базы данных из файла struct.sql:
rake db:structure:load
Здесь нет ничего волшебного: [ исходный код (показано здесь из Rails 3.2.16) просто вызывает psql на struct.sql.
Наконец, вот моя миграция, чтобы удалить старое, чувствительное к регистру ограничение по электронной почте и добавить функциональный индекс, чувствительный к регистру:
class FixEmailUniqueIndexOnUsers < ActiveRecord::Migration
def up
remove_index :users, :email
execute "CREATE UNIQUE INDEX index_users_on_lowercase_email
ON users USING btree (lower(email));"
end
def down
execute "DROP INDEX index_users_on_lowercase_email;"
add_index :users, :email, :unique => true
end
end
Меня раздражает, что я забыл, что хотел получить возвращаемый результат функции и должен был добавить в конце скобку null () ... Я имею в виду, что работал над этим смущающе долго, чтобы этого никогда не было щелкнуть в моей голове ... и он находится прямо рядом с другими правильными вызовами функций буквально перед моим лицом.
Квалифицированный идентификатор encodedjs.ReadEncodedJS
просто обозначает функцию, если используется как есть, это просто значение функции (например, может быть назначено переменным одного и того же типа функции).
Если вы хотите вызвать его и использовать возвращаемое значение, используйте скобки, например, encodedjs.ReadEncodedJS()
. Это подробно описано в Spec: Calls .
Поскольку вы хотите объединить string
значения, вы должны вызвать его:
js := "some text to simply show one way I've tried" + encodedjs.ReadEncodedJS()
string
- это string
, а func() string
- это функция, которая возвращает string
. Мне кажется, что encodedjs.ReadEncodedJS
является последним, и чтобы получить string
, который он возвращает, вы должны написать encodedjs.ReadEncodedJS()
.