2016-05-05 14 views
1

Ich versuche, Benutzermodifikationen zu erlauben, einzelne Einstellungen für andere Benutzer hinzuzufügen und zu entfernen, aber ich kann die has_many ... through Beziehung nicht richtig funktionieren: Ich kann neue Einstellungsmodale erstellen, aber ich kann nicht abrufen oder lösche sie.has_many, durch Beziehung nicht bevölkert

Hier ist meine User.rb:

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

ich die mit diesen users_controller Funktionen erstellen/löschen Methoden aufrufen:

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 

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 
... 

Hier mein Setting.rb ist

Wenn ich add_settings anrufen und dann remove_settings bekomme ich eine Erfolgsantwort beide Male, aber wenn ich add_settings wieder aufrufen, erhalte ich die Fehlermeldung:

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

So scheint es has_settings in User.rb immer false zurückkehrt und die Benutzereinstellung nicht entfernt wird, wenn die Reglerfunktion remove_settings aufgerufen wird.

Warum ist die user_settings Beziehung nicht gefüllt? Wie kann ich has_settings bekommen, um den korrekten Wert zurückzugeben?

Antwort

2

user_settings.include?(user) wird immer falsch zurückgegeben, da user_settings eine Sammlung von user_setting Objekten ist, nicht user Objekte. Darüber hinaus ist das Aufrufen von include? hier möglicherweise nicht effizient, da das Laden mehrerer Objekte user_settings in den Speicher erforderlich ist, um die einzelnen Objekte zu vergleichen.

Je nachdem, wie user_settings und settings definiert sind, sollten Sie in der Lage sein, die folgende Abfrage zu verwenden, um zu überprüfen, ob es irgendwelche user_settings sind, die zu diesem Benutzer gehören (self). Versuchen Sie die folgende Abfrage:

def has_settings?(user) 
    settings.exists?(following_id: user.id) 
end 
Verwandte Themen