我试图在我的 Rails 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
编辑:为了澄清,有三个“层”具有不同的月份结构,例如第 1 层的“一月”将从第一个开始,第 2 层将从第三个开始,依此类推。它被设计成只有三层(即三个不同的月份结构),一个客户只有一层,但是这个层有很多个月。月表也有一个限制,以确保同一层每月不超过 1 个条目。本质上,它是月份和客户之间的一种习惯关系,但客户所在的层决定了它返回的“组”。
这些表的设置方式使得客户和月份都具有 tier_id 外键,支票具有 client_id 外键和存款日期,月份具有 tier_id 以及开始和结束日期。tiers 表或多或少是层名称(第 1 层、第 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 = ?