Я создаю приложение базы данных в Catalyst, используя jqGrid для выполнения грязной работы по обработке отображения данных. У меня почти все работает, кроме возможности фильтровать результаты поиска по "тегам". У меня есть три таблицы с такими отношениями:
package MyApp::Schema::Result::Project;
...
__PACKAGE__->has_many(
"job_flags",
"MyApp::Schema::Result::ProjectFlag",
{ "foreign.project_id" => "self.id" },
{ cascade_copy => 0, cascade_delete => 0 },
);
...
__PACKAGE__->many_to_many(flags => 'project_flags', 'flag');
1;
и
package MyApp::Schema::Result::Flag;
...
__PACKAGE__->has_many(
"project_flags",
"MyApp::Schema::Result::ProjectFlag",
{ "foreign.flag_id" => "self.id" },
{ cascade_copy => 0, cascade_delete => 0 },
);
...
__PACKAGE__->many_to_many(projects => 'project_flags', 'project');
1;
и, наконец, таблица соединений
package MyApp::Schema::Result::ProjectFlag;
...
__PACKAGE__->belongs_to(
"flag",
"MyApp::Schema::Result::Flag",
{ id => "flag_id" },
{ is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" },
);
...
__PACKAGE__->belongs_to(
"project",
"MyApp::Schema::Result::Project",
{ id => "project_id" },
{ is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" },
);
...
1;
В моем контроллере, который предоставляет данные JSON для jqGrid, я использую Catalyst::TraitFor::Controller::jQuery::jqGrid::Search
для преобразования параметров запроса, сгенерированных jqGrid, в запросы в стиле DBIx::Class:
my $search_filter = $self->jqGrid_search($c->req->params);
my $project_rs = $c->model('DB::Project')->search(
$search_filter, {
join => 'project_flags',
group_by => 'id',
},
);
который затем передается генератору страниц jqGrid:
$project_rs = $self->jqgrid_page($c, $project_rs);
а затем я перебираю набор результатов и создаю свои столбцы jqGrid.
На стороне HTML я могу создать строку JSON, например
{"groupOp":"AND","rules":[{"field":"project_flags.flag_id","op":"eq","data":"2"}]}
и, в этом случае, показать проекты, имеющие строку в project_flags
с flag
id
из 2
.
Я абсолютно точно знаю, что делаю это неправильно! Вся документация, которую я могу найти по Catalyst и DBIx::Class, демонстрирует похожие идеи, но я просто не могу понять, как применить их в этой ситуации. (не то чтобы я не пробовал).
- Как мне создать средства доступа типа «
has_flag($flag_id)
», а затем использовать их из API jqGrid? Где в моем приложении Catalyst это место? - Один из способов, который я хотел бы отфильтровать, - это также отсутствие определенного флага.