Select

Witam

przy pomocy Restful Authenticatio wygenerowałem obsłuje rejestracju i logowania, teraz chce dodac kolejne pole select

<%= f.select( :province, { "dolnośląskie" => "dolnośląskie", "kujawsko-pomorskie" => "kujawsko-pomorskie", "lubelskie" => "lubelskie", "lubuskie" => "lubuskie", "łódzkie" => "łódzkie", "małopolskie" => "małopolskie", "mazowieckie" => "mazowieckie", "opolskie" => "opolskie", "podkarpackie" => "podkarpackie", "podlaskie" => "podlaskie", "pomorskie" => "pomorskie", "śląskie" => "śląskie", "świętokrzyskie" => "świętokrzyskie", "warmińsko-mazurskie" => "warmińsko-mazurskie", "wielkopolskie" => "wielkopolskie", "zachodniopomorskie" => "zachodniopomorskie", "zagranica" => "zagranica"},{:prompt => '----------- Wybierz -----------'}) %>
jednak widok generuje mi kolejne opcje z inną kolejnością

[code]

Województwo
----------- Wybierz -----------

opolskie warmińsko-mazurskie dolnośląskie małopolskie śląskie łódzkie pomorskie podkarpackie lubuskie zachodniopomorskie świętokrzyskie podlaskie mazowieckie kujawsko-pomorskie zagranica wielkopolskie lubelskie
[/code] Jak temu zaradzić aby generował poprawną kolejność ?

Oraz co sądzicie o takim sposobie wypełniania opcji select ?

Najlepiej zdefiniuj sobie gdzieś stałą z listą województw, czasami można nawet je wrzucić do bazy, sczególnie jeżeli są połączone z jakimiś modelami - wtedy może to sporo ułatwić.

Jeżeli chodzi o kolejność, to hash w ruby 1.8 nie zapamiętuje kolejności kluczy, stąd inna kolejność w wygenerowanych widoku. Select przyjmuj również tablicę tablic, ale w Twoim wypadku wystarczy jedna zwykła tablica. Zauważ, że klucze i wartości są u Ciebie takie same, więc wystarczy:

  f.select(:province, ["dolnośląskie", "kujawsko-pomorskie", ....])

Dzięki za konkrety. Właśnie myślałem o ty aby wrzucić województwa do bazy i powiązać z użytkownikiem, nie wiem jednak na dzień dzisiejszy jak należało by zbudować formularz rejestracyjny aby to działało poprawie.

tak czy inaczej wykombinowałem cos takiego.

[code]class User < ActiveRecord::Base
has_one :live
has_one :province :through => live
end

class Live < ActiveRecord::Base
belongs_to :user
belongs_to :province
end

class Province < ActiveRecord::Base
has_one :live
has_one :user, : through => live
end[/code]
czy to ma sens ??

A tak nie?

class User < ActiveRecord::Base belongs_to :province end class Province < ActiveRecord::Base has_many :users end
nie bić jakby co :smiley:

Próbuje zaimplementować obsługę województw poprzez relacje bazy danych

class User < ActiveRecord::Base has_one :live has_one :province, :through => :live end class Live < ActiveRecord::Base belongs_to :user belongs_to :province end class Province < ActiveRecord::Base has_one :live has_one :user, :through => :live end
Baza banych wygląda mniej-wiecej tak:

[code]Users
±—±-------------+
| id | name |
±—±-------------+
| 1 | ala |
| 2 | ela |
| 3 | ola |
| 4 | bob |
±—±-------------+

Provinces
±—±-------------+
| id | name |
±—±-------------+
| 1 | malopolska |
| 2 | wielkopolska |
| 3 | mazowieckie |
±—±-------------+

LIVES
±--------±------------+
| user_id | province_id |
±--------±------------+
| 1 | 2 |
| 2 | 1 |
| 3 | 3 |
| 4 | 2 |
±--------±------------+[/code]
Generalnie łudzę się ze konstrukcja jest ok i powinna działać

<%=h @user.province.name %>

Wyświetla poprawne województwo

Jednak mam problem z konstrukcją formularza rejestracyjnego.

[code]<% form_for @user do |f| %>
<%= f.error_messages %>

<%= f.text_field :name %>

<%= f.select( ??????????? , @province.collect {|r| [ r.name, r.id] }, :include_blank => true ) %>

<%= f.submit ‘Create’ %>
<% end %>

<%= link_to ‘Back’, users_path %>[/code]
Rozwijalna lista województw generuje sie prawidłowo, posiłkowałem sie poniższym postem
http://rubyonrails.pl/forum/t2089-Problemy-pocz%B1tkuj%B1cego-%28form_for-itd%29

wywnioskowalem z tego ze w miejsce pytajników pownieniem wstawić :provinces_id jednak wywala błąd.
Natomiast jesli wstawie :provinces formularz działa a w tabeli LIVES dodawane są przypadkowe wartości.

Generalnie nie wiem jak skonstruować formularz aby poprawnie dodawał poprawne wartosci dla :provinces_id oraz :user_id
cos mi sie obiło o uszy ze przy tworzeniu asocjacji możemy użyć czegoś takiego jak build[ aby automatycznie dodawał poprawny id_user taki jak id ale nie wiem czy w dobrym kierunku ide.

z góry dzięki za wskazówki

O ile dobrze rozumiem, chcesz trzymać informację o wielu miejscach zamieszkania pojedyńczego użytkownika? Zastanawia mnie sens istnienia tabeli LIVES.
Jeżeli chcesz trzymać informację taką jak opisałem w pierwszym zdaniu, zainteresuj się relacją has_and_belongs_to_many. Powinieneś mieć wtedy tabelę users_provinces o budowie takiej jak Twoja lives. Więcej na stronie 437 polskiego II wydania “Agile, programowanie w Rails” (stare ale fajne :D)

dzieki za rade, jednak zauważ ze chce trzymać informacje o jednym miejscu zamieszkania użytkownika

class User < ActiveRecord::Base has_one :live
dane miejsc zamieszkania chce trzymać w osobnej tabeli PROVINCES a relacje w LIVES

Generalnie takie rozwiązanie mi się podoba :slight_smile: nawet jeśli mało wygodne to chce umieć to zaimplementować

zawia5:

Nie patrz na to czy takie rozwiązanie Ci się podoba, tylko czy jest funkcjonalne, czy coś Ci daje, ewentualnie czy jest szybkie. Jeżeli przedstawisz mi tu kilka argumentów, które przekonają do takich tabel, to jestem skłonny się zgodzić, ale w tym momencie, to tylko zbędny kod i narzut wydajnościowy.

tabelę łączącą stosuje się w przypadku powiązań wiele do wielu. W tym wypadku jest to dla mnie totalnie bezsensowna opcja bez żadnych korzyści… za to wad jest dużo. Jeżeli chcesz się nauczyć wiązać modele z opcją :through, to wymyśl sobie jakiś realny problem, który można w ten sposób rozwiązać. W tym momencie robisz coś czego raczej w normalnej aplikacji byś nie zrobił, czyli walory edukacyjne są nikłe, a czasu pewnie nad tym trochę stracisz…

Tu taj, jakbyś się zdecydował na habtm:
http://railscasts.com/episodes/47-two-many-to-many

W ogóle polecam każdemu początkującemu te screencasty.
Jeśli ktoś jest z Łodzi i ma zbyt wolne łącze, by oglądać, to zapraszam do kontaktu na priv, mogę wypalić na płycie lub odwiedzić http://asciicasts.com/

Przyznaje, macie racje, takie rozwiązanie nie jest zbyt szczęśliwe. Co prawda myślałem o nim w nieco szerszych kategoriach tz. chciałem podobnej konstrukcji użyć do jeszcze kilku danych użytkownika ale przekombinowłęm, rozwiązanie z tablicą i dodatkowym polem w głównej tabel USERS jest dużo łatwiejsze do zrobienia i czytelniejsze.

drogus

Obiecuje ze wymyśle sobie sensowniejszy przykład do nauki asocjacji :slight_smile:

pozdrawiam