2016-05-05 12 views
1

ユーザーモーダルで他のユーザーの個別設定を追加および削除することを許可していますが、has_many ... through関係が正しく機能することができません。新しい設定モーダルを作成できます削除してください。ここでhas_many、through関係が設定されていません

は私User.rbです:ここでは

class User < ActiveRecord::Base 
    has_many :settings, class_name: "Setting", 
           foreign_key: "user_id", 
           dependent: :destroy 

    has_many :user_settings, through: :settings, source: :user 

    def create_settings(user) 
    settings.create(following_id: user.id) 
    end 

    def delete_settings(user) 
    settings.find_by(following_id: user.id).destroy 
    end 

    def has_settings?(user) 
    user_settings.include?(user) 
    end 
... 

は私Setting.rbです:

class Setting < ActiveRecord::Base 
    belongs_to :user, class_name: "User" 
    validates :user_id, presence: true 
    validates :following_id, presence: true 
end 

私はこれらのusers_controller機能を持つ作成/削除メソッドを呼び出す:

def add_settings 
    user = User.find(params[:user_id]) 
    if [email protected]_settings?(user) 
    @user.create_settings(user) 
    @user.save 
    end 
end 

def remove_settings 
    user = User.find(params[:user_id]) 
    if @user.has_settings?(user) 
    @user.delete_settings(user) 
    @user.save 
    end 
end 

add_settingsに電話してremove_settingsと答えたら、私は成功しました。両方の時間が、私は再びadd_settingsを呼び出す場合、私はエラーを取得する:

ActiveRecord::RecordNotUnique (PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_settings_on_user_id_and_following_id" 

だから、User.rbでhas_settingsは常にfalseを返すと、コントローラ機能remove_settingsが呼び出されたときに、ユーザー設定が削除されることはありませんようです。

user_settingsの関係にデータが入力されないのはなぜですか? has_settingsに正しい値を返すにはどうすればよいですか?

答えて

2

user_settings.include?(user)は、user_settingsuser_settingオブジェクトのコレクションであり、userオブジェクトではないため、常にfalseを返します。さらに、ここでinclude?を呼び出すことは、複数のuser_settingsオブジェクトをメモリに読み込んでそれぞれを比較する必要があるため、効率的ではないかもしれません。

user_settings、およびsettingsは、あなたがこのユーザ(self)に属しているすべてのuser_settingsがあるかどうかを確認するために、次のクエリを使用することができるはず規定されている方法に応じて。次のクエリを試してください:

def has_settings?(user) 
    settings.exists?(following_id: user.id) 
end 
関連する問題