【问题标题】:Selecting attributes using joins and select in rails使用连接选择属性并在导轨中选择
【发布时间】:2015-08-30 14:41:27
【问题描述】:

我有一个 TopicRelation 类,它使用 source_topic_idtarget_topic_id 在两个主题之间建立关系。这是模型:

class TopicRelation < ActiveRecord::Base
  belongs_to :source_topic, class_name: 'Topic'
  belongs_to :target_topic, class_name: 'Topic'
end

我正在尝试仅提取源主题的名称:

TopicRelation.joins(:source_topic, :target_topic)
  .where('source_topic_id=?', topic.id)
  .select('source_topics.name')

但是,这给了我以下错误:

TopicRelation Load (113.7ms)  SELECT  source_topics.name FROM `topic_relations` INNER JOIN `topics` ON `topics`.`id` = `topic_relations`.`source_topic_id` INNER JOIN `topics` `target_topics_topic_relations` ON `target_topics_topic_relations`.`id` = `topic_relations`.`target_topic_id` WHERE (source_topic_id=1) LIMIT 10
Mysql2::Error: Unknown column 'source_topics.name' in 'field list': SELECT  source_topics.name FROM `topic_relations` INNER JOIN `topics` ON `topics`.`id` = `topic_relations`.`source_topic_id` INNER JOIN `topics` `target_topics_topic_relations` ON `target_topics_topic_relations`.`id` = `topic_relations`.`target_topic_id` WHERE (source_topic_id=1) LIMIT 10
ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'source_topics.name' in 'field list': SELECT  source_topics.name FROM `topic_relations` INNER JOIN `topics` ON `topics`.`id` = `topic_relations`.`source_topic_id` INNER JOIN `topics` `target_topics_topic_relations` ON `target_topics_topic_relations`.`id` = `topic_relations`.`target_topic_id` WHERE (source_topic_id=1) LIMIT 10

是否可以使用这种方法同时为source_topictarget_topic 选择名称?

【问题讨论】:

    标签: mysql sql ruby-on-rails activerecord


    【解决方案1】:

    select 使用 db 表的名称,在您的情况下可能是 topics

    TopicRelation
      .joins('INNER JOIN topics target_topics ON topic_relations.target_topic_id = target_topics.id')
      .joins('INNER JOIN topics source_topics ON topic_relations.source_topic_id = source_topics.id')
      .where(source_topic: topic)
      .select('source_topics.name')
    

    这也会返回TopicRelation的列表;如果只需要主题名称,请使用方法pluck 而不是select

    【讨论】:

    • 谢谢。如何使用这种方法同时选择源主题名称和目标主题名称?这实际上是我真正的问题。将更新问题。
    • @Abram 我已经编辑了我的答案以使用 2 个连接,每个连接都有一个单独的表别名;另一种解决方案是查询Topic 并加入TopicRelation,这可能更具可读性,具体取决于您要实现的目标。
    • 真棒,是的。不确定哪种方法会更好,但基本上我会寻找包含 topic.id 作为源或目标 id 的 topic_relations。所以对于这个查询,我会添加where('source_topic_id=? OR target_topic_id=?', topic.id, topic.id) 来得到我想要的。不确定通过查询Topic 这样做是否会更有效?
    • 你不需要加入这个:TopicRelation.where('source_topic_id = :topic_id OR target_topic_id = :topic_id', {topic_id: topic.id})。这将返回TopicRelation 的列表。
    • 我加入的原因是我可以从主题中选择名称
    猜你喜欢
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 2021-05-10
    相关资源
    最近更新 更多