0

我试图在我的 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 = ?
4

2 回答 2

1

从您的解释中可以看出,Tier 是加入 Client 和 Month 的中间模型。

所以你可以在tiers上有clients和months表的引用,这意味着tiers表应该有client_id和month_id。

如果您之前有,请从 clients 表中删除 Tire_id,同样也从 Months 表中删除 tier_id。

并与has_many 建立模型关联:通过如下关系,您可以访问client.monthsmonth.clients

class Client < ActiveRecord::Base
  has_many :checks
  has_many :tiers
  has_many :months, through: :tiers
end

class Tier < ActiveRecord::Base
  belongs_to :client
  belongs_to :month
end

class Month < ActiveRecord::Base
  has_many :tiers
  has_many :clients, through: :tiers
  has_many :checks, -> { where deposit_date: start_date..end_date }
end

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

注意:
* 将 client_id 和 month_id 添加到 tiers 表
* 从months 表中
删除 tier_id * 从 clients 表中删除 tier_id

于 2013-07-29T07:02:05.483 回答
0

虽然一开始我没有意识到,但我无意中通过解决一个较小的问题回答了我自己的问题: Rails 与外键之间的关系?

正如我在那里的回答中所说,虽然这给了我想要的东西,但感觉不像“Rails Way”,所以我愿意接受有关如何改进解决方案的建议。

于 2013-07-31T15:51:31.573 回答