gpt4 book ai didi

ruby-on-rails - 将 Postgres 数组列用于 Rails 多对多关系

转载 作者:数据小太阳 更新时间:2023-10-29 08:08:11 24 4
gpt4 key购买 nike

我最近听说一些多对多一对多 关系(没有额外的连接数据,例如 user-membership-group)在 Postgres 中使用 id 的数组列而不是连接表可以显着更快地查询 see discussion for Node Postgres ORM .

对于多对多关系,选择哪个表(或两者)来维护关系数组将取决于查询的方向(用户<->组需要数组列两个表,users->tag 只需要在用户表的数组列中维护关系。

几个问题:

  • 是否有任何 gem(Rails 或其他)使用新的 Postgres 数组列来维护关系?
  • 在双向和单向 多对多 关系中,是否有人有任何基准来比较简单的连接表与数组列?
  • 要了解 Ruby 的性能改进,非常基本的功能如下所示。除了自定义主键、方法和类名的配置之外,您是否看到以下代码有任何明显的改进?

```

module ArrayRelationships

def self.included(base)
base.extend(ClassMethods)
end

module ClassMethods
# association must be lower case, pluralized name of associated class
def array_has_many(association)
define_method(association) do
instance_name = association.singularize
class_name = instance_name.titleize
class_name.constantize.where(id: self.send("#{instance_name}_ids"))
end
end
end
end

class User << ActiveRecord::Base
include ArrayRelationships
array_has_many :tags
end

当然,用户表必须在数据库中有:tag_ids 数组字段。如果我们想为 Tag#users 添加反向关系,我们只需添加 db 字段,包括 ArrayRelationships 和 array_has_many :users

最佳答案

编辑:在这个 gem 的页面上说,使用它需要您自担风险

WARNING: This gem is a work in progress and hasn't released yet.

我还没有尝试过,但似乎有人构建了一个 gem 来支持关联数组:https://github.com/marshall-lee/has_array_of .从 README 复制:

它是如何工作的?

假设我们有一个包含许多视频的播放列表。一个视频可以包含在多个播放列表中。这是典型的多对多情况,但我们以不同的方式实现它。

# db/migrate/20141027125227_create_playlist.rb
class CreatePlaylist < ActiveRecord::Migration
def change
create_table :playlists do |t|
t.integer :video_ids, array: true # adding array fields works only starting from Rails 4
t.index :video_ids, using: :gin # we add GIN index to speed up specific queries on array
end
end
end

# app/models/playlist.rb
class Playlist < ActiveRecord::Base
has_array_of :videos # by convention, it assumes that Post has a video_ids array field
end

# app/models/video.rb
class Video < ActiveRecord::Base
belongs_to_array_in_many :playlists # optional
end

现在我们可以像处理常规数组一样处理视频。它将正确代理对 video_ids 字段的所有更改。

playlist = Playlist.find(1)
playlist.videos = [video1,video2] # playlist.video_ids = [1, 2]
playlist.videos[0] = video3 # playlist.video_ids[0] = 3
playlist.videos.insert(1, video4) # playlist.video_ids = [3, 4, 2]
playlist.videos.delete_at(1) # playlist.video_ids = [3, 2]
playlist.videos.pop # playlist.video_ids = [3]
# ... and so on

video3.playlists
# => [playlist]

关于ruby-on-rails - 将 Postgres 数组列用于 Rails 多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30089073/

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