2011-01-04 22 views
1

この質問はほとんど答えていますが、私はまだそれが残虐だと思います。私は本当にただ、このような割り当ては、私の周りグーグルをたくさんやったし、すべての情報が矛盾している、または多くの関係に多くのセットアップについて説明し、そして複数の1対多の関係をレールで作成する

@user.browsing_location = location1 
@user.home_location = location2 

を割り当てるやりたい Trouble with Rails has_many relationships

仲介テーブルを使用するメソッドについて説明します。しかし実際にはデータベースは、ユーザテーブルが2つの異なる名前のidフィールドを持つ必要があります。次のようなことはありますか?私はこのための余分なテーブルを作成することを避けるためにたいので、私のモデルの

ユーザークラス

class User < ActiveRecord::Base 
    #locations created by this user 
    has_many :locations, :foreign_key => :creator_id 

    #locations for browsing and visiting 
    belongs_to :browsing_location, :source => :location 
    belongs_to :home_location, :source => :location 

end 

場所クラス

class Location < ActiveRecord::Base 
    #Users who are just browsing this location now 
    has_many :browsing_users, :foreign_key => :browsing_location_id, :source => :users 
    #Users who are living here now 
    has_many :home_users, :foreign_key => :home_location_id, :source => :users 

    #User who created this location 
    has_one :user 
end 

かなり多くは、このような関係が必要になります。

答えて

0

browsing_locationとhome_locationという2つのテーブルと、browsing_userとhome_userというユーザークラスを継承する2つのテーブルを継承しているようです。 Rails 3の場合:

あなたは一般的な考え方を持っていますが、少し混在しているようです。 :sourceは、使用する関連付けを決定するために多対多の関係に使用されます。代わりに必要と思われるものは次のとおりです。class_name

foreign_key属性を正しく使用するために、ユーザーと場所のテーブル定義を確認する必要があります。

user.rb 

class User < ActiveRecord::Base 
    # locations created by this user 
    has_many :locations, :foreign_key => :creator_id 

    # I'm assuming the locations belong to the user, as you're end goal was stated as 
    # the ability to call set user.browsing_location and user.home_location 
    # that would mean that browsing_location and home_location would need to belong to 
    # the User class, not the other way around. 
    has_many :browsing_locations, :class_name => :location 
    has_many :home_locations, :class_name => :location 

end 

class Location < ActiveRecord::Base 

    # User who created the location 
    belongs_to :user 

    # Users who are just browsing this location now 
    has_many :browsing_users, :class_name => :users 
    # Users who are living here now 
    has_many :home_users, :class_name => :users 

end 
+0

ありがとうございます - これは私が必要と思うものです。今すぐ試してみてください。余分なテーブルを作成するために、能動的なレコードが舞台裏で魔法を使っているのです(has_manyには逆の関係もあります)。それとも、私はそれがすべて正しく設定されていることを確認するために、私のテーブル定義を参照する必要があることを意味ですか? –

+0

Locationに属するクラスはUser型で、技術的にはUserクラスではないため、作成したhas_many関係はお互いに逆転しません。それ以外の場合は、多対多の関係があり、has_many:throughまたはhas_and_belongs_to_many関係のいずれかを行う必要があります。 –

+0

foreign_keyの定義を何よりも検証するために、テーブル定義を見たいと思っていました。通常、foreign_keyを定義する必要はありませんが、正しく実行しているようです。 –