gpt4 book ai didi

ruby-on-rails - Mysql 等同于 rails 查询

转载 作者:行者123 更新时间:2023-12-04 03:33:49 24 4
gpt4 key购买 nike

我是 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">]> 

连接两个表的解决方案是什么?

最佳答案

您通常不会直接使用 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')

关于ruby-on-rails - Mysql 等同于 rails 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27010141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com