Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DBIx::Class, триггеры или что-то вроде того 
:(
    Опции темы
Logo
Дата 13.5.2010, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Есть DBIx::Class(Catalyst) и MySQL. Можно ли к полям привязать некоторую функцию-чекер, что бы перед добавлением записи в базу данных проверить это поле, и в случае неудачи вернуть ошибки, для последующей передачи в браузер пользователя?
PM MAIL   Вверх
odmink0
Дата 14.5.2010, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 7.4.2010
Где: Рязань

Репутация: нет
Всего: нет



Переопредели метод new() твоего ResultSet-а (строки таблицы) так, чтобы он вываливал исключение при попытке создать строку с невалидным полем - и отлавливай это исключение при вызове $rs->create( \%fields_hash ); в контроллере Catalyst.

Не забудь в конце своего переопределенного new() вызвать $class->next::method($fields_hash_ref);
PM MAIL Jabber   Вверх
Logo
Дата 14.5.2010, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Но класс DBIx::Class::ResultSet один для всех таблиц, а мне нужно сделать проверку для конкретной таблицы.
PM MAIL   Вверх
odmink0
Дата 14.5.2010, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 7.4.2010
Где: Рязань

Репутация: нет
Всего: нет



Resultset - это объект, который представляет твою таблицу или результат выполнения запроса. Файлы, представляющие классы этого объекта, находятся в каталоге lib/MyApp/Schema/MyDB/Result.

Вот здесь можно получить некоторую информацию:
http://www.slideshare.net/kostenko/dbixclass
http://www.slideshare.net/jshirley/demystifying-dbixclass

Ну и в мануале, конечно ;)
PM MAIL Jabber   Вверх
Logo
Дата 14.5.2010, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Насколько я понимаю, то что лежит lib/MyApp/Schema/, это классы схемы.
ref $c->model('MyAppDB::Table') выдает DBIx::Class::ResultSet.
PM MAIL   Вверх
odmink0
Дата 14.5.2010, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 7.4.2010
Где: Рязань

Репутация: нет
Всего: нет



Цитата(Logo @ 14.5.2010,  11:32)
Насколько я понимаю, то что лежит lib/MyApp/Schema/, это классы схемы.
ref $c->model('MyAppDB::Table') выдает DBIx::Class::ResultSet.


Да, я слегка напутал в первом посте.

В каталоге lib/MyApp/Schema/MyDB/Result находятся классы, описывающие строки таблицы.
При вызове метода $resultset->create( \%fields ); (создание новой строки таблицы) вызывается метод new() класса, который описывает эту строку - одного из тех, которые находятся в каталоге Result. Вот именно там-то тебе и надо делать проверку - т.е. переопределять этот метод.

Код примерно такой:
Код

package TestApp::Schema::MyDB::Result::User;

# Created by DBIx::Class::Schema::Loader
# DO NOT MODIFY THE FIRST PART OF THIS FILE

use strict;
use warnings;

use base 'DBIx::Class::Core';

__PACKAGE__->load_components("InflateColumn::DateTime");
__PACKAGE__->table("users");

__PACKAGE__->add_columns(
  "user_id",
  { data_type => "integer", is_nullable => 0 },
  "email",
  { data_type => "varchar", is_nullable => 0, size => 255 },
  "password",
  { data_type => "varchar", is_nullable => 0, size => 255 },
  "first_name",
  { data_type => "varchar", is_nullable => 0, size => 255 },
  "last_name",
  { data_type => "varchar", is_nullable => 0, size => 255 },
  "phone",
  { data_type => "varchar", is_nullable => 0, size => 255 },
);
__PACKAGE__->set_primary_key("uid");


# Created by DBIx::Class::Schema::Loader v0.06001 @ 2010-05-14 11:25:12
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:B6bdyl12Ciynhg0PqORdnA

# You can replace this text with custom content, and it will be preserved on regeneration

sub new {
    my ($class, $fields_ref) = @_;

    if ( $fields_ref->{first_name} ) {
        if ( length $fields_ref->{first_name} < 3 ) {
            die "First name must be longer than 3 symbols!\n";
        }
    }

    return $class->next::method($fields_ref);
}

1;


PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0863 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.