2013-02-12 109 views
1

我对连接表中的外键感到困惑。我试图建立一个连接表,将我的用户和指南模型链接起来形成一个FavoriteGuideline表(即用户可以选择一个最喜欢的指南)。加入表和外键

我的错误是:

'预计FavoriteGuideline有belongs_to的关联称为 喜爱(FavoriteGuideline没有favorite_id外键)'

我favorite_guideline.rb是

class FavoriteGuideline < ActiveRecord::Base 
belongs_to :user 
belongs_to :guideline 
belongs_to :favorite, class_name: 'User', foreign_key: 'favorite_id' 

attr_accessible :user, :favorite, :guideline 
end 

and my favorite_guideline_test.rb is

require 'test_helper' 

class FavoriteGuidelineTest < ActiveSupport::TestCase 
    should belong_to(:user) 
    should belong_to(:favorite) 

    test "that creating a favorite works without raising an exception" do 

    assert_nothing_raised do 
    FavoriteGuideline.create user: users(:eve), guideline: guidelines(:three) 

    end 
end 
end 

而且我的数据库迁移

class CreateFavoriteGuidelines < ActiveRecord::Migration 
def change 
create_table :favorite_guidelines do |t| 
     t.integer :user_id 
     t.integer :favorite_id 
     t.integer :guideline_id 
    t.timestamps 
end 

add_index :favorite_guidelines, [:user_id] 
add_index :favorite_guidelines, [:favorite_id] 
add_index :favorite_guidelines, [:guideline_id] 
end 
end 

回答

1

如果我理解正确的话,FavoriteGuideline意味着是关联表。 Favorite(收藏夹)只是FavoriteGuideline的别名。

所以,你的模式应该是:

class FavoriteGuideline < ActiveRecord::Base 
set_primary_key 'favorite_id' 
belongs_to :user 
belongs_to :guideline 

attr_accessible :user, :favorite, :guideline 
end 

而且你的测试应该有行

should belong_to(:guideline) 

,而不是

should belong_to(:favorite) 

而迁移应该可能已经favorite_id作为主关键字:

def change 
create_table :favorite_guidelines, :primary_key => :favorite_id do |t| 
     t.integer :user_id 
     t.integer :guideline_id 
    t.timestamps 
end 

然后你还需要完成定义与has_many协会在user.rbguideline.rb

+0

我爱你。谢谢。 – tessad 2013-02-12 08:04:04