/ / Abstrakcja nazw kolumn w DBIx :: Class :: ResultSet - perl, katalizator, klasa dbix

Abstrakcja nazw kolumn w DBIx :: Class :: ResultSet - perl, katalizator, klasa dbix

Zajmuję się tworzeniem aplikacji Catalyst, która wykorzystuje DBIx::Class uzyskać dostęp do bazy danych MySQL. Aplikacja wykonuje kontrole jakości danych w pliku. Pliki są ładowane do tabeli FileContent:

 FILE_ID LINE_NUMBER FOO BAR BAZ
-----------------------------------
1       1           A   99  Blah
1       2           B   11  Blargh
1       3           A   4   Sproing
1       4           B   7   Sproing
1       5           B   10  Doink

Potem mam kolejny stół, Format, który określa działania weryfikacyjne każdej kolumny:

 COL_ORDER COL_NAME VALIDATION
1         FOO      regex:/^[AB]$/
2         BAR      unique_number
3         BAZ      regex:/S/

To, co chcę zrobić, to przejść FileContent linia po linii dla danego pliku, stosując wszystkie reguły w Format do każdej linii:

my @lines  = $c->model("DB::FileContent")->search({file_id => 1});
my @format = $c->model("DB::Format")->search();

foreach my $line (@lines)
{
foreach my $column (@format)
{
#Get the field matching this column from $line.
#e.g. for first $column get $line->foo()
}
}

Jednak nie jestem pewien, jak najlepiej skutecznie uzyskać kolumna z wiersza, który pasuje do bieżącej kolumny w formacie.Standardowy sposób dostępu do kolumn jest za pomocą metod, takich jak $line->foo. Ale co mam zrobić, kiedy foo jest zmienną?

Nie sądzę, że chcę to zrobić:

eval "$line->${$column->col_name}";

Jestem świadomy get_column, ale czy jest to skuteczne do uzyskania pojedynczej wartości z wiersza?

$line->get_column($column->col_name)

Jaki jest najskuteczniejszy sposób pobrania kolumny na podstawie wartości z drugiej tabeli? Mogę użyć nazwy kolumny lub kolumny. Z góry dziękuje za twoją pomoc.

Odpowiedzi:

2 dla odpowiedzi № 1

Spróbuj najpierw umieścić wszystkie reguły sprawdzania poprawności w hashref (lub hash), i - co najważniejsze - upewnij się, że elementy FileContent są zawyżone w hashrefach za pośrednictwem DBIx :: Class :: ResultClass :: HashRefInflator. Dzięki temu wygodniej jest uzyskać dostęp do pól w obrębie przedmiotu, gdy je przeglądasz.

Lubię to:

#------------------------------------------------------------------------------------------
# get all formats into a hashref
#------------------------------------------------------------------------------------------

my $format = $c->model("DB::Format")->search({}, { order_by => ["COL_ORDER"] } );
my @col_names = $format->get_column("COL_NAME")->all;
# @col_names now contains qw/FOO BAR BAZ/

my $formats;
@{$formats}{@col_names} = $format->get_column("VALIDATION")->all;

#------------------------------------------------------------------------------------------
# create an iterator over DB::FileContent, and make items inflate to hashrefs
#------------------------------------------------------------------------------------------

my $file_content  = $c->model("DB::FileContent")->search({file_id => 1});
$file_content->result_class("DBIx::Class::ResultClass::HashRefInflator");
# this ensures that every item inflates into a hashref


# this way you can iterate over items, and don"t have to put them all into an array
while (my $hashref = $file_content->next) {
# put relevant field values into an array
my @values = @{$hashref}{@col_names};
}