1

という名前のモデルがあり、User他のユーザーを として自己参照できるようにしたいと考えていますContact。より詳細には、ユーザーから他のユーザーへの一方向の関係が必要であり、あるユーザーの所有ユーザーを「連絡先」として参照できるようにしたいと考えています。また、関係に関連付けられた情報が必要なので、usercontact 関係にフィールドを追加します (この文を編集したところです)。

この質問への回答をガイドとして使用しながら、これを実行しようとしました。

Userモデルは次のとおりです。

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

UserContactまた、連絡先をユーザーに接続する一環としてモデルを作成しました。

usercontact.rb

class UserContact < ActiveRecord::Base
  belongs_to :user, :class_name => :User
  belongs_to :contact, :class_name => :User
end

私が使用した create_users.rb 移行ファイルは次のとおりです。

create_users.rb

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

create_users_contacts.rb の移行は次のとおりです。

create_users_contacts.rb

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

ただし、私には不明な理由で、ユーザーのインデックス ページに を使用する列があるため、リンクで何かがうまくいか<td><%= user.contacts.count %></td>なかったと思いますが、ページを読み込もうとすると、行から次のエラーが発生します。

uninitialized constant User::UserContact

この問題は、別のユーザーに関連付けられているユーザーに連絡先として名前を付けたいという事実に関係している可能性があると思います。これが行われている他の例が見つからないためです。他の例と同様)。

私が見つけた最も近い同様の問題は、この質問で概説され、解決されました。問題は彼の接続モデルの間違った命名でしたが、私は自分の命名を再確認しましたが、その質問者の問題はありません.

これが発生している理由を診断するために他のファイルや情報が必要な場合はお知らせください。

編集

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

編集 2

問題は、リンク テーブル users_contacts の名前が間違っていて、user_contacts である必要があったことです。修正したところ、動作するようになりました!!

4

1 に答える 1

1

usercontact.rbに名前を変更する必要がありますuser_contact.rb

これは、レールのオートロードが動作する命名規則です。

于 2013-06-30T23:35:24.920 に答える