我试图在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编辑:为了澄清,有三个“层”有一个不同的月份结构,例如,第一层的“一月”将从第一层开始,第二层将从第三层开始,等等。它的设计使得只有三个层(即三个不同的月份结构),一个客户端将只有一个层,但在这个层中有很多个月。月份表也有一个限制,以确保同一层的每个月不超过一个条目。从本质上说,这是一个月与客户之间的连接关系,但客户端所处的层次决定了它将返回哪个“组”。
表的设置方式使客户端和月份都有tier_id外键,支票具有client_id外键和存款日期,月份具有tier_id以及开始日期和结束日期。层表或多或少是层名称(第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 = ?发布于 2013-07-31 15:51:31
虽然一开始我没有意识到这一点,但我无意中回答了自己的问题,在这里解决了一个较小的问题:Rails relationships with foreign key between?
正如我在回答中所说的,虽然这给了我我想要的东西,但它并不像'Rails的方式‘,所以我愿意接受关于如何改进解决方案的建议。
发布于 2013-07-29 07:02:05
根据您的解释,它解释了Tier是连接客户端和月份的中间模型。
因此,您可以在层上获得客户端的引用和月份表,这意味着层表应该具有client_id和month_id。
如果您以前有客户端表,则从客户端表中删除tire_id,同样,还可以从月份表中删除tier_id。
和has_many的模型关联:通过关系,如下所示,这样您就可以访问client.months和month.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添加到层表中
*从月份表中删除tier_id
*从客户端表中删除tier_id
https://stackoverflow.com/questions/17914796
复制相似问题