Ruby on Rails-如何进行自定义查询?

时间:2019-11-18 07:27:32

标签: sql ruby-on-rails activerecord ruby-on-rails-5

我有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_idviewcontroller

我尝试在两个模型中都这样做

modelhas_many :message, foreign_key: :reporting_id

Subscription.rbbelongs_to :subscription

但是没有用。

在我的Message.rb中,view的search_field当前正在搜索MSISDN中的记录

有人知道我该怎么做到吗?

PS:我想防止编辑表结构。

3 个答案:

答案 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