2010-02-22 4 views
0

J'ai un ensemble de modèles imbriqués pour stocker les prix pour les chambres individuelles.rails construire la méthode pour le modèle complexe avec les jours de la semaine

Ie.

Places 
    Rooms 
     Room_rates 

Chaque modèle a le accepts_nested_attributes_for nécessaire et has_many belongs_to association et j'ai une forme et une méthode de construction qui fonctionne parfaitement pour la création initiale.

Ma question est de savoir comment créer un contrôleur plus intelligent, soit construire le champ s'il n'existe pas, soit en faire la lecture s'il le fait (et ne le construit pas). Actuellement, il ne fonctionne que pour l'entrée initiale, sinon il tente de construire plus de champs que ce qui est possible et interrompt la resoumission.

def new 
    @place = Place.find(params[:place_id]) 
    @rooms = @place.rooms 

    @rooms.each do |r| 
     7.times { r.room_rates.build } #days of the week 
    end 

    end 

essayé

@rooms.each do |r| 
    7.times { 
    unless r.room_rates 
     r.room_rates.build 
    end 
    } 
end 
base de données

pour room_rates

id, room_id, dayofweek, price 

forme

<% form_for @place do |f| %> 
    <%= f.error_messages %> 


<table> 
    <tr> 
    <th>Room</th> 
    <th>Mon</th> 
    <th>Tue</th> 
    <th>Wed</th> 
    <th>Thu</th> 
    <th>Fri</th> 
    <th>Sat</th> 
    <th>Sun</th> 
    </tr> 
    <% f.fields_for :rooms do |room| %> 
    <% dow = 0 %> 
     <tr> 
     <td><%= room.text_field :name %></td> 

     <% room.fields_for :room_rates do |rates| %> 

      <td>  
       <%= rates.text_field :price %> 
       <%= rates.text_field :dayofweek, :value => dow %> 
      </td> 
      <% dow += 1 %> 
     <% end %> 
     </tr> 
    <% end %> 
</table> 

<%= f.submit "Submit" %> 

<% end %> 

Répondre

1

Vous pouvez:

@rooms.each do |r| 
    ((r.room_rates.size+1)..7).each { 
     r.room_rates.build  
    } 
end 
+0

Cela semble bien fonctionner ... mais cela ne les met pas correctement en édition. Si quelqu'un ne met à jour qu'un seul champ dans la ligne, il l'enregistre et l'enregistre correctement, mais quand il recharge il le montre dans la position incorrecte? Au lieu d'être en colonne mercredi, il apparaît lundi sur le terrain, même si la base de données le montre correctement. Il n'a pas ce problème si aucun des champs d'une ligne est vide. – holden

+0

D'une manière ou d'une autre, la boucle doit les classer selon leur position dans la semaine? et je ne suis pas sûr de savoir comment faire ça. – holden

+0

Je pense que vous avez ici un problème de conception mauvaise. Pour moi, il semble mauvais si vous devez avoir exactement 7 lignes avec des prix pour chaque chambre. Cela fonctionnerait si vous construisiez 'room_rates' quand vous construisez' room', donc quand il va itérer sur 'room_rates', il y aura toujours lundi même si le prix est' nul '. J'ajouterais des colonnes comme 'monday_price',' tuesday_price' au modèle de pièce ou dans un modèle séparé qui stocke les prix pour toute la semaine. Ce sera beaucoup plus facile dans tous les cas. – klew

Questions connexes