0

2つのモデルを検討してください。

  1. User=>(id:整数、名前:文字列、created_at:日時、updated_at:日時、department_id:整数)
  2. Department=>(id:整数、名前:文字列、created_at:日時、updated_at:日時)

現在、これら2つのテーブルの間には明らかな関係があります。それは

  • それぞれUserに1つの部門があります
  • ADepartmentは多くのユーザーに属しています。つまり、1つの部門に複数のユーザーがいます。

なので、次のようにepressを選びましたA belongs_to B

class User < ActiveRecord::Base
  has_one :department
end
class Department < ActiveRecord::Base
  belongs_to :user
end

しかし、ご存知かもしれませんが、機能せず、次のエラーがスローされます。

> @user = User.find(1)
> @user.department.name
  Department Load (1.0ms)  SELECT "departments".* FROM "departments" WHERE "departments"."user_id" = 1 LIMIT 1
ActiveRecord::StatementInvalid: PG::Error: ERROR:  column departments.user_id does not exist

たくさんのヒットとトライアルの後。私はこれを定義する正しい方法に出くわしました。B belongs to A

class Department < ActiveRecord::Base
  has_many :users
end
class User < ActiveRecord::Base
  belongs_to :department
end
> @user = User.find(1)
> @user.department.name
Department Load (1.0ms)  SELECT "departments".* FROM "departments" WHERE "departments"."id" = 1 LIMIT 1
 => "HR"

さて、これは私の脳がこれらの関連について考える方法とは正反対です。だから、私は少し混乱しているので、誰かが何が起こっているのか説明できたら?

なぜB belongs to A&しないのA belongs to Bですか?

4

3 に答える 3

2

モデルが間違っています。それらは次のようになります。

class User < ActiveRecord::Base
  belongs_to :department
end

class Department < ActiveRecord::Base
  has_many :users
end

したがって、部門をユーザーに追加するには、次のようにします。

@user.department.create(:name => 'Science Department')

部門にユーザーを追加するには、次のようにします。

@department.users.create(:name => 'John')
于 2012-05-27T02:02:01.833 に答える
1

関係は:has_one一見少し奇妙です。ユーザーとアカウントを考えてみましょう。すべてのアカウントは1人のユーザーに接続されており、反対側からはユーザーのhas_oneアカウント、1つだけのアカウントに接続されています。アカウントは、ユーザーが所有するものです。

このような場合、モデルのhas_oneリレーションを使用すると、Railsはテーブル内の列を検索します(Railsガイドのhas_oneドキュメントを参照してください)。Useruser_idaccounts

あなたの特定のケースでは、「部門には多くのユーザーがいる」と「ユーザーは部門に属している」と言うのは完全に正しいと思います。

于 2012-05-26T23:57:07.687 に答える
-1

最初の例では、移行ファイルのテーブルに列とインデックスを追加する必要があります

class AddRelationToDeparments < ActiveRecord::Migration
  def change
    add_column, :deparments, :user_id, :integer
    add_index, :deparments: :user_id
  end
end
于 2012-05-26T23:46:13.237 に答える