私は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
にはc
とc.users
はu
となるようにするには、結合テーブルにデータを複製しないでください。
を追加しました:だから
は、私だけc.users << u
を選択した場合、私はcities
のためにこれを行うことができますか?
cities = Array.new()
UserCity.where(:user_id => u.id).each do |uc|
cities << City.find(uc.city_id)
end
ありがとうございます。私は1つを選ぶ必要がありますか? 「市が訪問した都市」と「市を訪問したユーザー」 – aoichan
はい、表示する都市を1つだけ選択します。関連する行を両方の方法で(ユーザーと都市の両方から)関連付けることができます。アクティブレコードがそれを行います。 – datalost
元の質問にいくつかのコードを追加しました。 – aoichan