2012-04-20 3 views
2

Utilisation de rails 3.2.3.Ruby on Rails - Clause where dans plusieurs tables

Cela me rend fou. Je sais que l'enregistrement actif est supposé simplifier ce type d'actions, mais je ne peux pas comprendre.

J'ai un modèle d'hôtel et d'installation. Les deux ont une relation has_and_belongs_to_many. Un hôtel peut avoir de nombreuses installations et mon but est de rechercher un hôtel par son nom/emplacement, note et installations.

Je suis capable de faire une recherche par les deux premiers mais je ne peux pas effectuer une recherche par établissement (ce sont des cases à cocher sur le formulaire de recherche).

Voir le code:

<%= form_tag hotels_path, :method =>'get' do%> 
     <p> 
      <b>Location:</b> 
      <%= text_field_tag :search, params[:search]%><br /><br /> 


      <b>Rating:</b><br /> 
      <%= radio_button_tag :ranking, '5'%>5 Stars<br /> 
      <%= radio_button_tag :ranking, '4'%>4 Stars<br /> 
      <%= radio_button_tag :ranking, '3'%>3 Stars<br /> 
      <%= radio_button_tag :ranking, '10'%>Hostels<br /><br /> 


      <b>Facilities:</b><br /> 
      <% for facility in Facility.find(:all) %> 
       <div class="field"> 
        <%= check_box_tag "fc[]", facility.id%> 
        <%= facility.description %> 
       </div> 
      <% end %> 

      <%= submit_tag "Search", :name => nil%> 
     </p> 
     <%end%> 

contrôleur d'hôtel:

def index 
    @hotels= Hotel.search(params) 

    respond_to do |format| 
     format.html 
     format.json { render :json => @hotels } 
    end 
    end 

modèle d'hôtel:

def self.search(params) 

    if params 

     arel = where('city LIKE ? OR name LIKE ?', "%#{params[:search]}%", "%#{params[:search]}%") 
     arel = arel.where('ranking = ?', params[:ranking]) if params[:ranking].present? 
     #arel = arel.where (' = ?', params([:fc])) -> i dont know what to put here 

     arel 
    else 
     all 
    end 
    end 

Fondamentalement, il doit chercher le nom/emplacement, étroit par le classement et l'affiner encore plus par les cases à cocher sélectionnées. Je ne peux pas obtenir le dernier. Le nom/emplacement et le classement sont dans la table des hôtels mais les installations de chaque hôtel sont dans la table commune facilities_hotels (cette table a pour les clés l'hotel_id et le facility_id) Par ailleurs, je suis capable de créer un hôtel avec toutes les facilités vouloir, de sorte que la relation entre les deux est correcte.

Toute aide est très appréciée

Répondre

4

Vous devez ajouter une clause pour obtenir joint à se joindre à l'autre table.

.joins(:facilities_hotels).where('facilities_hotels.facility_id = ?', params[:fc]) 
+0

Merci DGM qui a été très instructif. Bien que j'ai un autre problème avec cela. Il est dit : L'association nommée 'facilities_hotels' n'a pas été trouvée; peut-être l'avez-vous mal orthographié? Source extraite (autour de la ligne 72): <% @ hotels.each do | hotel |%> Avez-vous une idée de la raison pour laquelle cela se produit? Son étrangement sating l'association n'est pas formée. Merci encore pour votre réponse dans un si court préavis. – Silver

+0

Il devrait chercher quel que soit votre appel has_many. S'il s'agit d'un appel habtm, l'appel devra être plus explicite: 'joins ('INNER JOIN facilities_hotels') – DGM

+0

Pour plus d'informations, voir: http://guides.rubyonrails.org/active_record_querying.html#joining- – DGM

Questions connexes