我正在创建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
答案 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
选项覆盖默认值。