我对联接表中的外键感到相当困惑。我正试图建立一个连接表,将我的用户和指导方针模型链接起来,形成一个FavoriteGuideline表(即用户可以选择一个喜欢的指导方针)。
我的错误是:
'预期FavoriteGuideline有一个名为belongs_to的关联收藏夹(FavoriteGuideline没有favorite_id外键)'
我最喜欢的_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
我最喜欢的guideline_test.rb是
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
如果我理解正确,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)
您的迁移可能应该将preferente_id作为主键:
def change
create_table :favorite_guidelines, :primary_key => :favorite_id do |t|
t.integer :user_id
t.integer :guideline_id
t.timestamps
end
然后,您还需要在user.rb
和guideline.rb
中完成与has_many
的关联定义