【问题标题】:Mysql equivalent rails queryMysql等效rails查询
【发布时间】:2014-11-19 06:08:42
【问题描述】:

我是 Rails 新手。以下 sql 查询的等效 rails 查询是什么?

mysql> select a.code, b.name, b.price, b.page from article a inner join books b on a.id =b.article_id;

我在努力

Article.joins(:books).select("books.name, books.price, books.page, articles.code")

活动记录关系只返回表一数据

 => #<ActiveRecord::Relation [#<Article id: 1, code: "x", created_at: "2014-11-12 13:28:08", updated_at: "2014-11-14 04:16:06">, #<Article id: 2, code: "y", created_at: "2014-11-12 13:28:08", updated_at: "2014-11-14 04:00:16">]> 

加入两个表的解决方案是什么?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 activerecord


    【解决方案1】:

    您通常不会像这样直接使用 Rails 进行查询。相反,您需要设置模型并使用其他相关模型来实现此目的。如果速度是一个问题,您可以使用急切加载。如果你绝对需要这个连接,那就是:

    class Article < ActiveRecord::Base
      has_many :books
      scope :with_books, lambda { 
        joins(:books)
          .select('articles.code, books.name, books.price, books.page') 
      }
    end 
    
    class Book < ActiveRecord::Base
      belongs_to :article
    end
    

    但这不是很有用。它会生成您想要的连接,但是这样检索书籍详细信息并不有趣。你可以这样做:

    a = Article.with_books.where("books.name = 'Woken Furies'").first
    a.code
    

    这应该会给你文章代码。根据您的需要,更好的方法可能是从Article 类中删除范围,改为查询如下:

    b = Book.where(name: 'Woken Furies')
          .joins(:article)
          .where("articles.code = 'something'")
    
    b = Book.where("name = 'Woken Furies' AND articles.code = 'something'")
          .joins(:article)
    

    这两个查询应该是等效的。您可以通过以下方式从一条关联记录获取另一条记录:

    book = b.first
    article_code = book.article.code
    

    我不确定您需要通过联接完成什么,但我认为您可能会通过使用普通的 ActiveRecord 获得更漂亮的代码。如果您需要提高速度、避免 n+1 问题等,手动编写这些连接可能是有意义的。

    希望我正确理解了您的问题。

    关于加入 Rails 指南的更多信息:

    http://guides.rubyonrails.org/active_record_querying.html#joining-tables

    更新:如果您需要检索例如,您可以使用pluck只是代码和名称:

    Article.with_books
      .where("books.name = 'Woken Furies'")
      .pluck('articles.code, books.name')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 2014-04-19
      相关资源
      最近更新 更多