Mysql等效rails查询

时间:2014-11-19 06:08:42

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

我是铁杆新手。以下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">]> 

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

1 个答案:

答案 0 :(得分: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')