2010-09-22 5 views
3

Basé sur les modèles suivantsRails 3 has_and_belongs_to_many crée des cases à cocher en vue

class Company < ActiveRecord::Base 
    has_and_belongs_to_many :origins 
end 

class Origin < ActiveRecord::Base 
    has_and_belongs_to_many :companies 
end 

Je veux avoir dans mon companies/_form une collection de cases à cocher représentant toutes les origines.

Je ne sais pas si le Company.new(params[:company]) dans companies_controller#create peut créer l'association entre l'entreprise et les origines sélectionnées?

Je cours des rails 3.0.0, quelle est la meilleure manière de réaliser cela?

Merci pour vos idées

Répondre

9

HABTM n'est pas un choix populaire ces jours-ci, il est préférable d'utiliser has_many: grâce à la place, avec un bon modèle rejoindre entre les deux. Cela vous donnera la méthode Company # origin_ids = à laquelle vous pouvez passer un tableau d'identifiants d'origine à partir de votre formulaire, pour définir toutes les origines associées à @company. par exemple

<% current_origin_ids = @company.origin_ids %> 
<% form_for @company do |f| %> 
    <label>Name:<%= f.text_field :name %></label> 
    <% Origin.all.each do |origin| %> 
    <label><%= origin.name %> 
     <%= check_box_tag "company[origin_ids][]", origin.id, current_origin_ids.include?(origin.id) %> 
    </label> 
    <% end %> 
<% end %> 

En aparté, en utilisant un modèle approprié rejoindre, avec le contrôleur correspondant, vous permet d'ajouter/supprimer facilement origines avec AJAX, en utilisant créer/supprimer des appels au contrôleur de la jointure modèle.

+0

génial, merci – denisjacquemin

+0

Vous pouvez ajouter une balise de champ caché sinon il ne fonctionnera pas si vous décocher tout. hidden_field_tag ​​'entreprise [origin_ids] []', [] – Agustin

+0

@Agustin - bon point –

2

Personnellement, je ne suis pas convaincue que le fait d'avoir beaucoup de choses à faire est toujours mieux, cela dépend vraiment de votre situation. Has-many-through est meilleur s'il n'y a AUCUNE possibilité que votre modèle de jointure ait des attributs lui-même. C'est plus flexible pour changer. Il supprime la magie de certaines conventions Rails. Si toutefois vous n'avez pas besoin de has-many-through, alors il y a un vieux RailsCast pour HABTM checkboxes qui pourrait vous être utile.

3

Je dois être d'accord avec @carpeliam un has_many :through ne devrait pas être le choix par défaut. Un HABTM fonctionne bien et implique moins de code. Il ne limite pas l'utilisation d'ajax et expose un setter origin_ids auquel vous pouvez passer un tableau d'identifiants. Par conséquent, le screencast, tandis que de 2007, fonctionne toujours avec Rails 3. L'autre option si vous utilisez simple_form est la suivante:

= form.association :origins, :as => :check_boxes