0

Rails 4 アプリケーションでいくつかの関係を設定しようとしていますが、問題が発生しています。次の 4 つのクラスがあります。

class Client < ActiveRecord::Base
  has_many :checks
  belongs_to :tier
  has_many :months
end

class Check < ActiveRecord::Base
  belongs_to :client
  belongs_to :group, class_name: "Month"
end

class Tier < ActiveRecord::Base
  has_many :clients
  has_many :months
end

class Month < ActiveRecord::Base
  has_many :clients
  belongs_to :tier
  has_many :checks, ->(month) { where deposit_date: month.start_date..month.end_date }

  validates_uniqueness_of :group, scope: :tier_id
end

編集: 明確にするために、異なる月構造を持つ 3 つの「ティア」があります。たとえば、ティア 1 の「1 月」は 1 番目から始まり、ティア 2 は 3 番目から始まります。これは、3 つの層 (つまり、3 つの異なる月構造) のみが存在するように設計されており、クライアントは 1 つの層のみを持ちますが、この層には何ヶ月もかかります。月間テーブルにも制限があり、同じ階層のエントリが 1 か月あたり 1 つを超えないようにします。基本的には、月とクライアントの間の習慣的な関係ですが、クライアントがどの「グループ」を取得するかを決定するのは、クライアントが属する階層です。

テーブルは、クライアントと月の両方が tier_id 外部キーを持ち、小切手が client_id 外部キーと預金日を持ち、月が tier_id と開始日と終了日を持つようにセットアップされます。tiers テーブルは多かれ少なかれ層の名前 (Tier 1、Tier 2) のプレースホルダーであり、クライアントとその月を結びつけることを目的としています。クライアントの階層に一致するテーブル内のすべての月を見つける @client.months を記述できるようにしたいと考えています。さらに、@month.checks のようなことをしたいと考えています。これは、特定の月に特定のクライアントに対して投稿されたすべての小切手を見つけます。しかし、私はあらゆる種類のトラブルに遭遇しています。

それで、現在のスキーマを機能させる方法があるかどうか、変更を加える必要があるかどうか、またはすべてをゼロから再考する必要があるかどうか疑問に思っています! そして、さらに重要なのは、そこに到達する方法です....

編集

データベースから取得しようとしているものの例は、SQL では次の形式になります。

SELECT ch.*
FROM clients cl
JOIN tiers t ON cl.tier_id = t.id
JOIN months m ON m.tier_id = t.id
JOIN checks ch ON ch.client_id = clients.id
WHERE clients.id = ? AND m.group = ?

または、より簡単に:

SELECT ch.*
FROM clients cl
JOIN months m ON m.tier_id = cl.tier_id
JOIN checks ch ON ch.client_id = clients.id
WHERE clients.id = ? AND m.group = ?
4

2 に答える 2