1

私はUser、City、UserCityという3つのモデルを作成しました。has_many:結合テーブルに重複を作成する

Userクラス:

class User < ActiveRecord::Base 
    has_many :user_cities, :dependent => :destroy, :uniq => true 
    has_many :cities, :through => :user_cities 
end 

市クラス:

class City < ActiveRecord::Base 
    has_many :user_cities, :dependent => :destroy, :uniq => true 
    has_many :users, :through => :user_cities 
end 

UserCityクラス:

class UserCity < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :city 
end 

そして私は

u = User.new() 
c = City.new() 
u.cities << c 
c.users << u 
p UserCity.all.size # => 2 
を試してみました10

user_citiesテーブルに重複がありました。それでは、私は

UserCityクラスをコード化:

class UserCity < ActiveRecord::Base 
    validates :user_id, :uniqueness => {:scope => :city_id} 
    belongs_to :user 
    belongs_to :city 
end 

と上記と同じRubyのコードを実行します。しかし、私は重複を禁止したので、c.users << uの後に失敗しました。

u.citiesにはcc.usersuとなるようにするには、結合テーブルにデータを複製しないでください。


を追加しました:だから

は、私だけc.users << uを選択した場合、私はcitiesのためにこれを行うことができますか?

cities = Array.new() 
UserCity.where(:user_id => u.id).each do |uc| 
    cities << City.find(uc.city_id) 
end 

答えて

2

u.cities << cまたはc.users << uのいずれかを選択してください。それらのそれぞれは、ジョイン・テーブルに挿入された行を引き起こします。

+0

ありがとうございます。私は1つを選ぶ必要がありますか? 「市が訪問した都市」と「市を訪問したユーザー」 – aoichan

+0

はい、表示する都市を1つだけ選択します。関連する行を両方の方法で(ユーザーと都市の両方から)関連付けることができます。アクティブレコードがそれを行います。 – datalost

+0

元の質問にいくつかのコードを追加しました。 – aoichan

0

重複する結合エントリを誤って追加しようとすると、エラーが発生するdbにインデックスを追加することで、dbの重複を防ぐこともできます。移行で次のようなことをしてください:

add_index :cities_users, [:city_id, :user_id], unique: true 
関連する問題