0

RoRは初めてですが、アプリの構築に苦労しています。db構造に関するアドバイスを探しています。

私は4つのモデル/テーブルを持っています:ユーザー>クライアント>ジョブ>タスク

アプリは次のように動作します。

  1. ユーザーはログインします
  2. 彼らはクライアントを追加することができます
  3. 彼らはクライアントにジョブを追加することができます
  4. 彼らはジョブにタスクを追加することができます

つまり、タスクはジョブに属し、ジョブはクライアントに属し、クライアントはユーザーに属します。

DBにクライアント、ジョブ、またはタスクのいずれかを照会し、それが現在ログインしているユーザーに属していることを確認したいと思います。「railsy」結合クエリを作成し、これを実行できるように関連付けを設計するのに苦労しています。

すべてのテーブルにuser_idフィールドがあれば、これは非常に簡単ですが、それは正しい方法ではないようです。

http://guides.rubyonrails.org/association_basics.htmlでガイドを読みましたが、まだ少し暗闇の中にいます。誰かが私のDBをどのように構成するか、そしてもっと重要なことに私の関連付けに光を当てることができますか?

どうも。

4

2 に答える 2

2

アソシエーションを一方の側から直接設定しているようです。必要なのは、has_manyを使用してアソシエーションのもう一方の端を追加することだけです。

class Task < ActiveRecord::Base
  belongs_to :job
end

class Job < ActiveRecord::Base
  belongs_to :client
  has_many :tasks
end

class Client < ActiveRecord::Base
  belongs_to :user
  has_many :jobs
  has_many :tasks, :through => :jobs
end

class User < ActiveRecord::Base
  has_many :clients
  has_many :jobs, :through => :clients
  has_many :tasks, :through => :jobs
end

これで、ActiveRecordが結合を処理します。確かに、純粋なdbスキーマでは、user_idを複数の場所(ここではclientsテーブル)に配置しないでください。ただし、dbクエリがそれほど大きくないため、パフォーマンスを向上させるために、tasksおよびjobsテーブルにも追加される場合があります。それでも、データの一貫性を保つためにより多くの努力を払う必要があります。たとえば、ジョブがそのクライアントと同じuser_idを持っていることを確認する必要があります。

次に、次のようなショートカットの関連付けを定義できます。

class Task < ActiveRecord::Base
  belongs_to :user
end

しかし、この場合、クエリが遅すぎてニーズに合わないことに気付かない限り、私はそれを行いません。時期尚早の最適化は悪です:-)

于 2012-05-26T07:14:07.010 に答える
1

あなたの質問を正しく理解したかどうかはわかりませんが、これが解決策になると思います。

このように関連付けを作成すると、またはActiveRecordを要求すると自動的に結合が作成されます。user.jobsuser.tasks

class User < ActiveRecord::Base
  has_many :clients
  has_many :jobs, :through => :clients
  has_many :tasks, :through => :jobs
end

詳細については、Rails-Api-Documentationを参照してください。

1つのリクエストでユーザーのすべてを取得したい場合。あなたはこれを行うことができます:

user.clients.joins(:jobs => :tasks)
于 2012-05-26T07:17:03.513 に答える