Rails - 自引用关联

时间:2015-09-06 19:35:25

标签: ruby-on-rails associations

我正在创建RoR应用。我有一个名为'用户'的模型。我想在用户之间建立一个“多对多”的关系。那就是自我指涉联想。

我用相应的控制器生成了'友谊'模型:
rails g model Friendship friend1:integer,friend2:integer,active:boolean
rails g controller Friendships create destroy

点击“添加朋友”后,将通过“创建”操作调用friendship_controller。此操作应该创建新的“友谊”,但是当我点击“添加朋友”时,会出现错误:未知属性'user_id'用于友谊。

这是我写的代码:

视图:(@ user是我想添加为朋友的人)

<%= link_to 'Add friend', create_friendship_path(:friend2 => @user), :method => :post %>

路线:

post 'create_friendship' => 'friendships#create'

控制器:

class FriendshipsController < ApplicationController
  def create
    @friendship = current_user.friendships.build(:friend2 => params[:friend2])
    if @friendship.save
      flash[:notice] = 'Friend added'
    else
      flash[:error] = 'Friend was not added'
    end
  end
end

用户模特:

class User < ActiveRecord::Base
  has_many :friendships
  has_many :friends, through: :friendships
end

FRIENDSHIP模特:

class Friendship < ActiveRecord::Base
  belongs_to :user
  belongs_to :friend, class_name: 'User'
  validates :friend1, presence: true
  validates :friend2, presence: true
end

我从未使用过与Rails的自引用关联,因此有一个我找不到的错误。谢谢你的建议。

Schema.rb

ActiveRecord::Schema.define(version: 20150904134846) do

  create_table "friendships", force: :cascade do |t|
    t.integer  "friend1"
    t.integer  "friend2"
    t.boolean  "accepted"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  add_index "friendships", ["friend1", "friend2"], name: "index_friendships_on_friend1_and_friend2", unique: true
  add_index "friendships", ["friend1"], name: "index_friendships_on_friend1"
  add_index "friendships", ["friend2"], name: "index_friendships_on_friend2"

  create_table "users", force: :cascade do |t|
    t.string   "name"
    t.string   "email"
    t.boolean  "admin",           default: false
    t.string   "password_digest"
    t.string   "remember_digest"
    t.datetime "created_at",                      null: false
    t.datetime "updated_at",                      null: false
  end

  add_index "users", ["email"], name: "index_users_on_email"

end

1 个答案:

答案 0 :(得分:0)

friendships表的架构没有遵循Rails标准来定义属于关联,因此代码崩溃。

具体来说,您使用

定义了关联
t.integer  "friend1"
t.integer  "friend2"

而Rails默认情况下需要一个以关联加上_id命名的字段。

belongs_to :user
belongs_to :friend, class_name: 'User'

因此你应该使用

t.integer  "user_id"
t.integer  "friend_id"

重命名数据库中的字段或使用foreign_key选项覆盖默认值。