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
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
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
Pour plus d'informations, voir: http://guides.rubyonrails.org/active_record_querying.html#joining- – DGM