0
funktioniert

Ich habe 3 Modelle:.Rails Attribute verschachtelt: validates_uniqueness_of nicht

class UserLanguage < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :language 
end 

class Language < ActiveRecord::Base 
    has_many :user_languages 
    has_many :users, :through => :user_languages 
end 

class User < ActiveRecord::Base 
    has_many :user_languages, :dependent => :destroy 
    has_many :languages, :through => :user_languages 
    accepts_nested_attributes_for :user_languages, :allow_destroy => true 
end 

ich nested_form gem bin mit Benutzer zu helfen, wählen Sie die Sprache (n) sie können in sprechen Die CRUD dafür ist adaequat .

Aber ich kann die Eindeutigkeit der UserLanguage nicht validieren. Ich versuche, diese 2-Syntax, aber sie haben für mich nicht:

validates_uniqueness_of :language_id, scope: :user_id 
validates :language_id, :uniqueness => {:scope => user_id} 

Mein Schema für user_languages ​​Tabelle:

create_table "user_languages", force: :cascade do |t| 
    t.integer "user_id" 
    t.integer "language_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    add_index "user_languages", ["language_id"], name: "index_user_languages_on_language_id", using: :btree 
    add_index "user_languages", ["user_id"], name: "index_user_languages_on_user_id", using: :btree 

Was soll ich tun, dass ein Benutzer machen kann, wenn nur eine Sprache wählen? Angenommen, ich wähle Englisch in der Dropdown-Liste, wird mein zweites Englisch nicht gespeichert (dupliziert) und abgelehnt.

Antwort

0

Wenn Nutzer haben und nur eine Sprache haben sollen, dann könnte man die Mächtigkeit zwischen den Modellen ändern:

class Language < ActiveRecord::Base 
    has_many :users 
end 

class User < ActiveRecord::Base 
    has_one :language 
end 

Dann definitions Benutzer nur eine Sprache zu einer Zeit haben und Ihr gesamtes Modell wird einfacher.

Sie können mehr über aktive Datensatz Verbände und Mächtigkeiten lesen in this Association Basics guide

+0

Vielen Dank für Ihre Hilfe. Schätze es wirklich. –

0

Dies ist, wie ich es endlich tat später

class UserLanguage < ActiveRecord::Base 

    belongs_to :user 
    belongs_to :language 

    def self.delete_duplicated_user_languages(user_id) 
     user_languages_ids  = UserLanguage.where(user_id: user_id).pluck(:language_id).sort 
     duplicate_language_ids = user_languages_ids.select {|language| user_languages_ids.count(language) > 1} 
     duplicate_language_ids.uniq! 
     keep_this_language = [] 
     duplicate_language_ids.each do |language_id| 
      keep_this_language << UserLanguage.find_by(user_id: user_id, language_id: language_id).id 
     end 
     single_language = user_languages_ids.select {|language| user_languages_ids.count(language) == 1} 
     single_language.each do |language| 
      keep_this_language << UserLanguage.find_by(user_id: user_id, language_id: language).id 
     end 
     UserLanguage.where(user_id: user_id).where.not(id: keep_this_language).destroy_all 
    end 

end 

ich alle s speichern UserLanguage erste und löschen Sie sie (duplicate sind).