连接表和外键

时间:2013-02-12 07:00:14

标签: ruby-on-rails ruby-on-rails-3

我对连接表中的外键感到困惑。我正在尝试构建一个连接表,链接我的用户和指南模型以形成一个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

我的favorite_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

1 个答案:

答案 0 :(得分:1)

如果我理解正确,FavoriteGuideline应该是关联表。收藏夹只是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_manyuser.rb

中完成与guideline.rb的关联定义