我有2个具有数百万条记录的表:
第一个表是Subscription
,第二个表是Message
。
在Subscription
表中,我有3个索引:
subscription_id
msisdn
reporting_id
但是,在Message
表中,我只有2个索引:
message_id
reporting_id
我在msisdn
表中有Message
,但是它没有建立索引。
因此,我有一个仪表板UI,可让我搜索Message
。
我想使用Message
搜索msisdn
,但是由于msisdn
未被索引,因此查询将永远进行下去!
但我想将“在msisdn
表中索引Message
的想法作为计划B。
所以我的计划A是(这是我需要帮助的地方):
由于两个表都已索引reporting_id
,所以我想使用仪表板中的Message
搜索subscription.msisdn
,然后从那里开始使用subscription.reporting_id
和列出所有带有Message
的{{1}}。
类似subscription.reporting_id
。
对于这2个表,我分别具有subscription.reporting_id = message.reporting_id
,view
和controller
,
我尝试在两个模型中都这样做
model
在has_many :message, foreign_key: :reporting_id
和
Subscription.rb
在belongs_to :subscription
但是没有用。
在我的Message.rb
中,view
的search_field当前正在搜索MSISDN
中的记录
有人知道我该怎么做到吗?
PS:我想防止编辑表结构。
答案 0 :(得分:2)
如果要在Subscription类中建立has_many :messages
关联,则需要指定primary_key。
class Subscription < ApplicationRecord
has_many :messages, foreign_key: "reporting_id", primary_key: "reporting_id"
end
这样,生成的SQL将如下所示:
SELECT "messages".* FROM "messages" WHERE "messages"."reporting_id" = $1 [["reporting_id", "#{reporting_id}"]]
primary_key确保使用reporting_id
模型的Subscription
值,否则它将默认为id列。
但是,除了建立似乎没有完全标准化的关联(至少3NF)之外,您还可以使用msisdn和report_id进行查询以查找所有消息。这样的事情仍然应该有效:
Message.
joins("INNER JOIN subscriptions ON subscriptions.reporting_id = messages.reporting_id").
merge(Subscription.where(msisdn: "#{value}"))
答案 1 :(得分:1)
还必须添加主键
has_many :message, foreign_key: :reporting_id, primary_key: :reporting_id
中的Subscription.rb
答案 2 :(得分:0)
找到了解决方案!
在我的Message.rb
中,我做到了:
belongs_to :subscription, foreign_key: :reporting_id, primary_key: :reporting_id
它生成了这个查询
SELECT `subscription`.* FROM `subscription` WHERE `subscription`.`reporting_id` = '1eaa7a61fe635005c81df347b1a7c401' LIMIT 1