gpt4 book ai didi

ruby-on-rails - 我应该如何使用 Rails 来索引和查询连接表?

转载 作者:数据小太阳 更新时间:2023-10-29 06:59:35 25 4
gpt4 key购买 nike

我有一个 ruby​​ on Rails 4 应用程序,使用 devise 以及用户模型和交易模型。

我正在为用户和交易之间的 has_many/has_many 关系创建一个 user_deals 表。

这里是迁移

class CreateUserDeals < ActiveRecord::Migration

def change
create_table :user_deals do |t|
t.belongs_to :user
t.belongs_to :deal
t.integer :nb_views

t.timestamps
end
end
end

当用户加载一个 Deal(例如 Deal id= 4)时,我使用一个名为 show 的方法

controllers/deal.rb
#for the view of the Deal page
def show
end

在这个 Deal id=4 页面的 View 中,我需要显示 Devise 的 current_user 的 View 的 nb 在用户当前所在的 Deal 页面中

deal/show.html

here is the nb of views of user: <% current_user.#{deal_id}.nb_views%>

假设我有 10M+ user_deals 行,我想知道是否应该使用索引

add_index :user_deals, :user_id
add_index :user_deals, :deal_id

或者也许

add_index(:deals, [:user_id, deal_id])

确实在其他情况下我会说是的,但在这里我不知道 Rails 在幕后是如何工作的。感觉好像 Rails 知道该做什么而无需我加快进程,...好像当 Rails 加载此 View 时没有 SQL 查询(例如“查找 nb of views WHERe user_id = xdeal_id= Y')...因为我只为登录的 current_user 使用(通过设计的 current_user) 和 deal_id Rails 知道它,因为我们在这个交易的页面(显示页面)上,所以我只是将它作为参数传递。

那么我是否需要索引来加速它?

最佳答案

你关于索引的问题很好。 Rails 确实生成 SQL* 来发挥它的魔力,因此优化数据库的一般规则适用。

设计的魔力只延伸到当前用户。它使用高效的 SQL 查询获取他们的详细信息,因为由 devise 创建的用户表在默认情况下具有有用的索引。但这些不是您需要的索引。

首先,有一种更简洁、更惯用的方式来做你想做的事

class CreateUserDeals < ActiveRecord::Migration
def change
create_join_table :users, :deals do |t|
t.integer :nb_views
t.index [:user_id, :deal_id]
t.index [:deal_id, :user_id]
t.timestamps
end
end
end

您会注意到迁移包括两个索引。如果您从未期望为给定的交易创建所有用户的 View ,那么您将不需要这些索引中的第二个。然而,正如@chiptuned 所说,索引每个外键几乎总是正确的选择。整数上的索引消耗的写入资源很少,但在读取时却节省了大量资源。这是一个成本非常低的默认防御位置。

如果将数据获取逻辑放在 Controller 中,您会玩得更开心,事情也会更清楚。此外,您正在展示一个交易,因此将其作为数据获取的中心而不是 current_user 感觉是正确的。

您实际上可以在不使用 through 关联的情况下执行此查询,因为您可以在不触及 users 表的情况下执行此查询。 (尽管在其他情况下您可能希望通过 through 关联。)只需 has_many :user_deals 即可完成这项工作。

为了最好地利用数据库引擎并在一次查询中执行此操作,您的 Controller 可以如下所示:

def show
@deal = Deal.includes(:user_deals)
.joins(:user_deals)
.where("user_deals.user_id = ?", current_user.id)
.find(params["deal_id"])
end

那么在你看来...

I can get info about the deal: <%= @deal.description %>

感谢 includes,我无需单独的 SQL 查询即可获取用户 nb_views: <%= @deal.user_deals.nb_views %>

* 如果您想查看 SQL rails 神奇地生成了什么,只需将 .to_sql 放在末尾即可。例如sql_string = current_user.deals.to_sql@deal.to_sql

关于ruby-on-rails - 我应该如何使用 Rails 来索引和查询连接表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33946044/

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