2016-05-16 24 views
0

Ich habe drei Modelle: Deal, Postleitzahl, DealIncludeZipcode. JetztRuby on Rails verschachtelte Form

sucht der Verband wie folgt: -

Deal Modell:

class Deal < ActiveRecord::Base 
    has_many :deal_include_zipcodes, dependent: :destroy 
    has_and_belongs_to_many :zipcodes, dependent: :destroy 

    accepts_nested_attributes_for :deal_include_zipcodes,:reject_if => :reject_include_zipcodes, allow_destroy: true 

    private 
    def reject_include_zipcodes(attributes) 
     if attributes[:deal_id].blank? || attributes[:zipcode_id].blank? 
     if attributes[:id].present? 
      attributes.merge!({:_destroy => 1}) && false 
     else 
      true 
     end 
     end 
    end 
end 

class Zipcode < ActiveRecord::Base 
    has_and_belongs_to_many :deals 
end 


class DealIncludeZipcode < ActiveRecord::Base 
    belongs_to :deal 
    belongs_to :zipcode 
end 

nun in Sicht habe ich eine Checkbox, es auf unchecking ich mehrere zipcode wählen kann von DealIncludeZipcode.But zu wählen, wenn Ich speichere die Daten, die nicht gespeichert werden.

Ich habe die Migration für den Beitritt Zip-Code und Deal-Modell verwendet, in dem meine Exclude-Postleitzahl funktioniert ordnungsgemäß.

Bitte bieten Sie eine Lösung. Ich habe verschiedene Methoden ausprobiert, aber nicht erfolgreich.

Antwort

0

Der springende Punkt von has_and_belongs_to_many ist, dass Sie kein Modell haben, das die beiden Teile verbindet.

class Deal < ActiveRecord::Base 
    has_and_belongs_to_many :zipcodes 
end 

class Zipcode < ActiveRecord::Base 
    has_and_belongs_to_many :deals 
end 

Würde durch einen "kopflos" Tisch deals_zipcodes genannt beitreten. Wenn Sie ein Join-Modell haben möchten, müssen Sie stattdessen has_many :through verwenden.

class Deal < ActiveRecord::Base 
    has_many :deal_zipcodes, dependent: :destroy 
    has_many :zipcodes, through: :deal_zipcodes 
end 

class DealZipcode < ActiveRecord::Base 
    belongs_to :deal 
    belongs_to :zipcode 
end 

class Zipcode < ActiveRecord::Base 
    has_many :deal_zipcodes, dependent: :destroy 
    has_many :deals, through: :deal_zipcodes 
end 
+0

Ich weiß das und ich habe sie zum Ausschließen von Postleitzahlen verwendet. –

+0

Ich habe eine Funktionalität für die Einbeziehung von Postleitzahlen. Der Benutzer kann ein- und ausschließende Postleitzahlen verwenden, indem er eine Postleitzahl auswählt, die auf Jquery funktioniert. Wo und wie Daten für die Postleitzahl als Join-Tabelle speichern gespeichert werden, enthält Daten für "Postleitzahl ausschließen". –

+0

Ich glaube immer noch nicht, dass Sie es verstehen - Ihr Code verwendet das Modell "DealIncludeZipcode" überhaupt nicht, da die Beziehungen falsch definiert sind. – max

0

Ich denke Max hat Recht. So sollte die Migration

create_table :deals do |t| 
    t.string :name 
    ... 
end 
create_table :zipcodes do |t| 
    t.string :zipcode 
    ... 
end 
create_table :deals_zipcodes do |t| 
    t.belongs_to :deal, index: true 
    t.belongs_to :zipcode, index: true 
end 

und Ihre Modelle sollten

class Deal < ActiveRecord::Base 
    has_and_belongs_to_many :zipcodes 
end 
class Zipcode < ActiveRecord::Base 
    has_and_belongs_to_many :deals 
end 

Sie wahrscheinlich einen Blick auf die ActiveRecord guide nehmen sollten, wo Sie weitere Erklärung finden.

+0

Ich weiß das und ich habe diese + Ich habe noch einen zusätzlichen Tabellennamen DealIncludeZipcode. –

+0

Dann warum DealIcludeZipcode nicht nur als gemeinsame Tabelle verwenden? – Zino

+0

Ich meine, der ganze Sinn der Verwendung von has_and_belongs_to_many-Assoziation besteht darin, eine gemeinsame Tabelle zu erstellen, die an keiner anderen Information als der Assoziation selbst festhält. Wenn Sie zusätzliche Informationen oder Logik haben, die in die Assoziation gehen müssen, dann verwenden Sie einfach has_many .. through .. würde Ihnen wahrscheinlich besser dienen. – Zino