我是铁杆新手。以下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">]>
加入这两个表的解决方案是什么?
答案 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')