首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rails中的4路关系

rails中的4路关系
EN

Stack Overflow用户
提问于 2013-07-29 01:33:29
回答 2查看 240关注 0票数 0

我试图在Rails 4应用程序中建立一些关系,但我遇到了一些问题。

代码语言:javascript
复制
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

编辑:为了澄清,有三个“层”有一个不同的月份结构,例如,第一层的“一月”将从第一层开始,第二层将从第三层开始,等等。它的设计使得只有三个层(即三个不同的月份结构),一个客户端将只有一个层,但在这个层中有很多个月。月份表也有一个限制,以确保同一层的每个月不超过一个条目。从本质上说,这是一个月与客户之间的连接关系,但客户端所处的层次决定了它将返回哪个“组”。

表的设置方式使客户端和月份都有tier_id外键,支票具有client_id外键和存款日期,月份具有tier_id以及开始日期和结束日期。层表或多或少是层名称(第1层、第2层)的占位符,其目的是将客户端与其月份结合起来。我希望能够描述@client.months,它将在表中找到与客户端层匹配的所有月份。而且,我还想做一些类似于@month.checks的事情,它将在一个特定的月中找到一个特定客户端的所有支票。但我遇到了各种各样的麻烦。

因此,我想知道是否有办法使我当前的模式工作,是否需要进行修改,或者是否需要从头开始重新考虑整个过程!更重要的是,如何到达那里.

编辑

我试图从数据库中获得的一个例子是SQL中的以下形式:

代码语言:javascript
复制
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 = ?

或者,更简单地说:

代码语言:javascript
复制
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 = ?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-31 15:51:31

虽然一开始我没有意识到这一点,但我无意中回答了自己的问题,在这里解决了一个较小的问题:Rails relationships with foreign key between?

正如我在回答中所说的,虽然这给了我我想要的东西,但它并不像'Rails的方式‘,所以我愿意接受关于如何改进解决方案的建议。

票数 0
EN

Stack Overflow用户

发布于 2013-07-29 07:02:05

根据您的解释,它解释了Tier是连接客户端和月份的中间模型。

因此,您可以在层上获得客户端的引用和月份表,这意味着层表应该具有client_id和month_id。

如果您以前有客户端表,则从客户端表中删除tire_id,同样,还可以从月份表中删除tier_id。

has_many的模型关联:通过关系,如下所示,这样您就可以访问client.monthsmonth.clients

代码语言:javascript
复制
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添加到层表中

*从月份表中删除tier_id

*从客户端表中删除tier_id

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17914796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档