Rails - 自我参照协会
Rails - self referential association
我正在创建 RoR 应用程序。我有一个名为 'User' 的模型。我想在用户之间创建 'Many to many' 关系。然后是自我参照联想。
我用相应的控制器生成了 'Friendship' 模型:
rails g 模型友谊 friend1:integer, friend2:integer, active:boolean
rails g controller 友情 create destroy
点击 'Add friend' 后,会调用 friendship_controller 并执行 'create' 操作。此操作应该创建新的 'Friendship',但是当我单击 'Add friend' 时,出现错误:友谊的未知属性 'user_id'。
这是我写的代码:
VIEW:(@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
友情模型:
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
您的 friendships
table 架构不遵循 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
选项覆盖默认值。
我正在创建 RoR 应用程序。我有一个名为 'User' 的模型。我想在用户之间创建 'Many to many' 关系。然后是自我参照联想。
我用相应的控制器生成了 'Friendship' 模型:
rails g 模型友谊 friend1:integer, friend2:integer, active:boolean
rails g controller 友情 create destroy
点击 'Add friend' 后,会调用 friendship_controller 并执行 'create' 操作。此操作应该创建新的 'Friendship',但是当我单击 'Add friend' 时,出现错误:友谊的未知属性 'user_id'。
这是我写的代码:
VIEW:(@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
友情模型:
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
您的 friendships
table 架构不遵循 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
选项覆盖默认值。