我試圖使用UserLocations連接表實現用戶模型和位置模型之間的雙向has_many :through
關聯。這將啓用用內置ActiveRecord方法設置用戶位置,即。 @user.locations = [<Location 1>, <Location 2>, ...]
。我的目標是不單獨將位置與用戶相關聯,而是讓用戶通過另一個字段一次添加或刪除一個或多個位置::zip_code
。這意味着當用戶添加一個郵政編碼時,ActiveRecord應該在UserLocations中插入一條記錄(類似於INSERT INTO user_locations (user_id, zip_code) VALUES (1, 12345)
)。然後,當調用@user.locations
時,ActiveRecord應加入:zip_code
並獲取匹配的位置。我目前的實現工作,除了一個INSERT
到UserLocations是爲與郵政編碼相關聯的每個位置生成的。通過has_many中的自定義外鍵防止重複:通過
class User < ActiveRecord::Base
has_many :user_locations
has_many :locations, through: :user_locations
end
class UserLocation < ActiveRecord::Base
belongs_to :user
belongs_to :location, primary_key: :zip_code, foreign_key: :zip_code
end
class Location < ActiveRecord::Base
has_many :user_locations, primary_key: :zip_code, foreign_key: :zip_code
has_many :users, through: :user_locations
end
事情我已經嘗試:
validates_uniqueness_of :zip_code, scope: :user_id
- 只是拋出一個驗證錯誤,並阻止所有記錄創建has_many unique: true
- 不防止重複DB查詢add_index unique: true
爲(user_id, zip_code)
- 至少可以防止重複條目被創建,但我試圖完全防止不必要的查詢
使用像this one這樣的問題作爲指導並沒有讓我更接近。是我試圖做到不使用我自己的方法來獲取/設置用戶位置?
Josh,如果其中一個答案幫助你需要接受它 – Benj