Cześć,
Próbuję zrobić eksport do CSV.
Najpierw robię nagłówki:
form1names = Form1.attribute_names
To mi daje ładną listę wszystkich atrybutów. W tym daje mi kolumnę “role_ids” prawdopodobnie z powodu użycia gema Rolify. No ale to dotyczy każdej kolumny, która odpowiada za klucz obcy.
W następnym kroku przy tworzeniu linii pliku CSV używam:
form1part = u.Form1.attributes.values
Problem w tym, że attributes.values nie zwraca niczego jeśli nie ma w kolumnie klucza obcego żadnego ID.
Przez to kolumny nagłówków nie odpowiadają kolumnom danych.
Oczywiście mógłbym kolumny nagłówków tworzyć ręcznie, ale w ten sposób jeśli zmieni mi sie układ kolumn w modelu będę musiał to przerabiać.
Jest jakiś sposób aby albo w attribute_names nie było kluczy obcych, albo żeby attributes.values zwracało pustego stringa jak natrafi na taką kolumnę?
Z góry dzięki za jakieś sugestie.
values
to po prostu metoda na hashu, która zwraca wartości jego kluczy. Jeśli podejrzysz sobie dokumentację dla model#attributes
, to jest tam napisane, że “attributes() returns a hash of all the attributes with their names as keys and the values of the attributes as values”. Chodzi więc tylko o te pola zdefiniowane dla danego modelu. Jeśli jest role_id, to zwróci ID, a jeśli nie, to nila.
Jest jakiś sposób aby albo w attribute_names nie było kluczy obcych, albo żeby attributes.values zwracało pustego stringa jak natrafi na taką kolumnę?
Zakładając, że dana aplikacja podąża za railsowymi standardami, możesz po prostu wyrzucić wszystkie atrybuty, których nazwa kończy się na _id
:
form1names = Form1.attribute_names.reject { |name| name.ends_with?('_id') }
form1part = u.Form1.attributes.reject{ |name| name.ends_with?('_id') }.values
Zastanawiam się, czy nie lepiej zrobić po prostu coś takiego:
attributes = u.Form1.attributes.reject { |name, value| name.ends_with?('_id') }
names = attributes.names
values = attributes.values
Jeśli chciałbyś dodatkowo wyciągnąć dane dotyczące powiązanych modeli, to zawsze możesz użyć model#serializable_hash
, na przykład form.serializable_hash(include: :role)
.
Pojawia się tutaj kolejny problem – wyciągnięcie nazw wszystkich kolumn (w tym także tych dla modelu role
). serializable_hash(include: :role)
po prostu nie dołączy klucza role
w przypadku, gdy dany rekord nie ma przypisanej żadnej roli. Aczkolwiek podejrzewam, że pierwszy sposób Ci wystarczy 
Dzięki za pomoc.
Wpadłem na problem z tym rozwiązaniem w przypadku użycia mongoid. Niestety wtedy zwraca atrybuty dla obiektu w dowolnej kolejności. Zrobiłem sobie pętelkę, która przelatuje wszystkie nazwy atrybutów dla klasy i pobiera na podstawie tego wartości z obiektu. W innym wypadku nie ma szans na dopasowanie danych do nagłówka.