Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails中自参考模型的问题_Ruby On Rails_Model_Self Reference - Fatal编程技术网

Ruby on rails Rails中自参考模型的问题

Ruby on rails Rails中自参考模型的问题,ruby-on-rails,model,self-reference,Ruby On Rails,Model,Self Reference,我有一个名为User的模型,我希望能够以联系人的身份自引用其他用户。更详细地说,我想要从用户到其他用户的单向关系,并且我想要能够将一个用户的拥有用户引用为“联系人”。另外,我希望有与该关系相关的信息,因此我将向usercontact关系添加字段(我刚刚在中编辑了这句话) 我试图这样做,同时使用的答案作为指导 以下是用户型号: user.rb class User < ActiveRecord::Base attr_accessible(:company, :email, :first_

我有一个名为
User
的模型,我希望能够以
联系人的身份自引用其他用户。更详细地说,我想要从用户到其他用户的单向关系,并且我想要能够将一个用户的拥有用户引用为“联系人”。另外,我希望有与该关系相关的信息,因此我将向usercontact关系添加字段(我刚刚在中编辑了这句话)

我试图这样做,同时使用的答案作为指导

以下是
用户
型号:

user.rb

class User < ActiveRecord::Base
  attr_accessible(:company, :email, :first_name, :last_name,
      :phone_number, :position)

  has_many(:user_contacts, :foreign_key => :user_id,
      :dependent => :destroy)
  has_many(:reverse_user_contacts, :class_name => :UserContact,
      :foreign_key => :contact_id, :dependent => :destroy)
  has_many :contacts, :through => :user_contacts, :source => :contact

end
class UserContact < ActiveRecord::Base
  belongs_to :user, :class_name => :User
  belongs_to :contact, :class_name => :User
end
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :first_name
      t.string :last_name
      t.string :phone_number
      t.string :email
      t.string :company
      t.string :position

      t.timestamps
    end
  end
end
class CreateUsersContacts < ActiveRecord::Migration
  def up
    create_table :users_contacts, :force => true do |t|
      t.integer :user_id, :null => false
      t.integer :contact_id, :null => false
      t.boolean :update, :null => false, :default => false
    end

    # Ensure that each user can only have a unique contact once
    add_index :users_contacts, [:user_id, :contact_id], :unique => true
  end

  def down
    remove_index :users_contacts, :column => [:user_id, :contact_id]
    drop_table :users_contacts
  end
end
下面是我使用的create_users.rb迁移文件:

创建用户。rb

class User < ActiveRecord::Base
  attr_accessible(:company, :email, :first_name, :last_name,
      :phone_number, :position)

  has_many(:user_contacts, :foreign_key => :user_id,
      :dependent => :destroy)
  has_many(:reverse_user_contacts, :class_name => :UserContact,
      :foreign_key => :contact_id, :dependent => :destroy)
  has_many :contacts, :through => :user_contacts, :source => :contact

end
class UserContact < ActiveRecord::Base
  belongs_to :user, :class_name => :User
  belongs_to :contact, :class_name => :User
end
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :first_name
      t.string :last_name
      t.string :phone_number
      t.string :email
      t.string :company
      t.string :position

      t.timestamps
    end
  end
end
class CreateUsersContacts < ActiveRecord::Migration
  def up
    create_table :users_contacts, :force => true do |t|
      t.integer :user_id, :null => false
      t.integer :contact_id, :null => false
      t.boolean :update, :null => false, :default => false
    end

    # Ensure that each user can only have a unique contact once
    add_index :users_contacts, [:user_id, :contact_id], :unique => true
  end

  def down
    remove_index :users_contacts, :column => [:user_id, :contact_id]
    drop_table :users_contacts
  end
end
我认为问题可能与我想将与另一个用户相关联的用户命名为联系人这一事实有关,因为我找不到其他这样做的示例,而且就我所知,我正在以其他方式正确地完成所有操作(类似于其他示例)

我发现的最接近的类似问题是在中概述和解决的。问题是他的连接模型的命名不正确,但是我仔细检查了我的命名,它没有那个询问者的问题

如果需要任何帮助,请告诉我是否需要任何其他文件或信息来诊断发生这种情况的原因

编辑

将usercontact.rb更改为user_contact.rb后,我现在遇到以下错误:

PG::Error: ERROR:  relation "user_contacts" does not exist
LINE 1: SELECT COUNT(*) FROM "users" INNER JOIN "user_contacts" ON "...
                                                ^
: SELECT COUNT(*) FROM "users" INNER JOIN "user_contacts" ON "users"."id" = "user_contacts"."contact_id" WHERE "user_contacts"."user_id" = 1
编辑两个


问题是我的链接表users\u contacts被错误命名,应该是user\u contacts!所以我把它修好了,现在它似乎可以工作了

您需要将
usercontact.rb
重命名为
user\u contact.rb


这是命名约定rails autoload可与一起使用。

您需要将
usercontact.rb
重命名为
user\u contact.rb


这是命名convention rails autoload的工具。

谢谢!我认为这很有帮助,但现在我将错误添加到问题的底部。谢谢!我有多个问题,它出现了,但你肯定给了我解决我最初的问题:)谢谢!我认为这很有帮助,但现在我将错误添加到问题的底部。谢谢!我遇到了多个问题,但你肯定给了我解决最初问题的方法:)