Booleansches Feld tinyint(1) true/false/nil

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Booleansches Feld tinyint(1) true/false/nil

    Hallo allerseits,

    wie angekündigt kommen nun öfters Fragen von mir zum Thema RoR ;)

    Ich habe folgenden Code in einem meiner Formulare, der - so der Plan - je nach Auswahl des Benutzers 1, 0 oder NULL in die Datenbank eintragen sollte. Das Datenbankfeld ist wie folgt definiert:

    Quellcode

    1. `gender` tinyint(1) default NULL


    (Warum hier tinyint(1) und nicht bool verwendet wird, weiß ich nicht. Bei der Migration habe ich gender:boolean angegeben - das kam raus.)

    Der Ruby-Code schaut so aus:

    Quellcode

    1. <p>
    2. <%= f.label :gender, "Geschlecht" %>
    3. Männlich <%= f.radio_button :gender, true %>
    4. Weiblich <%= f.radio_button :gender, false %>
    5. Keine Angabe <%= f.radio_button :gender, nil %>
    6. </p>



    Wähle ich jedoch "Keine Angabe" mit dem Wert nil (Ruby für NULL) landet false in der Datenbank. 8|

    Kann mir da jemand einen Rat geben? Ich habe ein altes Ticket im RoR-Trac gefunden, angeblich ist dieser "Fehler" behoben. Ich verwende die aktuelleste Rails-Version.

    Danke für die Hilfe!

    P.S.: Ich sehe gerade, dass der ausgegebene Quelltext davon wie folgt aussieht:

    Quellcode

    1. <p>
    2. <label for="profile_gender">Geschlecht</label>
    3. Männlich <input id="profile_gender_true" name="profile[gender]" type="radio" value="true" />
    4. Weiblich <input checked="checked" id="profile_gender_false" name="profile[gender]" type="radio" value="false" />
    5. Keine Angabe <input id="profile_gender_" name="profile[gender]" type="radio" />
    6. </p>


    Eine Idee, wie ich nil setzen kann?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von philippgerard ()

  • Welche Datenbank verwendest du denn?
    Abhängig davon wird ein nil in RoR interpretiert. PostgreSQL zum Beispiel besitzt ein boolean-Datentyp der für Ruby wie gemacht ist. MySQL hingegen besitzt (zumindest bis jetzt glaub ich) keinen Datentyp Boolean und speichert das ganze dann in einem integer. Dort wird ein false als 0 und ein true als 1 übersetzt. Ein nil entspricht wohl false, also auch 0. Der Datentyp von postgesql bietet da mehr!
  • Ich benutze MySQL, aber auch MySQL kennt doch den Typ NULL, den man aus nil machen könnte. Gibts keine Möglichkeit, RoR mitzuteilen, dass nicht false gesetzt werden soll, sondern NULL? :(

    Wenn ich das manuell nachbessere im Controller geht es auch. Nur ist das nicht KISS, DRY usw. ;)

    Quellcode

    1. if params[:profile][:gender] == "on"
    2. params[:profile][:gender] = nil
    3. end
    Warum "on"? Aus

    Quellcode

    1. Keine Angabe <%= f.radio_button :gender, nil %>
    wird

    Quellcode

    1. Keine Angabe <input checked="checked" id="profile_gender_" name="profile[gender]" type="radio" />
    was in RoR als "on" ankommt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von philippgerard ()

  • Falls mal jemand über das gleiche Problem stolpert...Man kann natürlich mittels

    Quellcode

    1. if params[:profile][:gender] == "on"
    2. params[:profile][:gender] = nil
    3. end
    prüfen, ob das Feld als "on" übergeben wurde (das kommt in Ruby an wenn man nil als Feldwert angibt) und es dann manuell nil setzen. Ist halt nicht schön, funktioniert aber. Ich fühle mich, als ob ich mit PHP programmieren würde :D