0

を動作しません、私は3つのモデルがあります。私は、ユーザーが彼らが話すことができた言語(複数可)を選択を助けるためにnested_form gemを使用していRailsのネストされた属性:validates_uniqueness_ofは

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 

をそのためのCRUDが正常に動作しています。

しかし、私はUserLanguageの一意性を検証できません。私はこの2構文を試みるが、彼らは私のために動作しませんでした:

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

user_languagesテーブルのための私のスキーマ:

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 

は、私は一人のユーザが一度のみの言語を選択することができますを確認するために何をすべきか?私がドロップダウン内で英語を選択すると、2番目の英語は保存されず(重複して)拒否されます。

class Language < ActiveRecord::Base 
    has_many :users 
end 

class User < ActiveRecord::Base 
    has_one :language 
end 

そして、定義により、ユーザーは一度に一つの言語を持つことになりますし、あなたの全体的なモデルは次のようになります。ユーザーが持っている、唯一の言語を持っている必要があり

答えて

0

場合は、モデル間のカーディナリティを変更することができます簡単です。

あなたはアクティブなレコード協会とカーディナリティin this Association Basics guide

+0

ありがとうございます。心から感謝する。 –

0

についての詳細を読むことができますこれは私が最終的にそれをやった方法です:

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 

私はすべてのUserLanguage初を保存して後で(重複するもの)を削除します。

関連する問題