2013-09-19 5 views
5

Мне действительно нужен совет от опытных разработчиков Ruby/Rails о том, что является общим и правильным способом сохранить ассоциацию has_and_belongs_to_many?Как правильно сэкономить отношения HABTM на Rails

Вот что я сделал, но мне он чувствует себя очень грязно, и я действительно не хотел бы видеть, что код в моем приложении :)

модели/company.rb

class Company < ActiveRecord::Base 
    has_and_belongs_to_many :type_taxes 

    ## Add Type taxes association 
    def insert_types_taxes(types_taxes) 
    self.type_taxes.clear 
    self.type_taxes << types_taxes 
    end 
end 

модели/taxe.rb

class Taxes < ActiveRecord::Base 
    has_and_belongs_to_many :societes 
end 

контроллеры/societes_control Лер

class SocietesController < ApplicationController 
    # I use basically the same code for the update method 
    def create 
    params[:societe][:type_taxes_ids] ||= [] 
    @societe = Societe.new(societe_params) 
    @societe.user_id = current_user.id 
    if @societe.save 
     add_types_taxes_to_societe 
     redirect_to societes_path 
    else 
     load_resources 
     render :new 
    end 
    end 

    private 
    def add_types_taxes_to_societe 
     types_taxes = TypeTaxe.find params[:societe][:type_taxe_ids] 
     @societe.insert_types_taxes types_taxes 
    end 
end 

Когда эта работа хорошо, это действительно чувствует себя грязным мне. Это также не говорит мне, было ли создание ассоциаций успешным или нет.

Любые предложения более чем желателен, чтобы улучшить свои навыки и свой код :)

Благодарности

ответ

6

Когда вы непосредственно повторно назначить HABTM ассоциацию с помощью =, он удалит присоединиться к записи, которые не присутствуют в что вы его назначаете. То есть:

types_taxes = TypeTaxe.find params[:societe][:type_taxe_ids] 
@societe.types_taxes = types_taxes 

по существу то же, что и у вас. Он будет удалять и добавлять записи, но только по мере необходимости, поэтому, если есть перекрытие, перекрывающиеся записи просто останутся назначенными.

Смежные вопросы