gpt4 book ai didi

ruby-on-rails - Rails 与几乎所有其他模型的关联

转载 作者:行者123 更新时间:2023-12-01 12:57:35 25 4
gpt4 key购买 nike

我正在寻找一些关于如何在我的系统中处理“区域”的建议。系统中的几乎所有其他模型(新闻、事件、项目等)都需要有一个可以对其进行排序的区域。到目前为止,我已经考虑过在 RegionLink 表上使用 has_many :through 的区域模型。我从来没有将一个模型加入到这么多其他模型中,我想知道这条路线是否有任何负面影响。我还考虑过使用 acts_as_taggable_on gem 并将区域标记为模型。这似乎没问题,但我将不得不编写更多清理类型代码来处理客户重命名或删除区域。

无论我选择什么,我都需要处理重命名,更重要的是,删除区域。如果某个区域被删除,我可能只会让用户选择另一个区域来替换关联。

非常感谢有关处理此问题的任何建议。

最佳答案

如果每个新闻、事件等仅属于 1 个区域,则标签似乎不是最适合 IMO 的方法。这给您留下了 2 个选择:

为每个模型添加一个 region_id 字段

这是最简单的,但缺点是您不能一次查看所有“区域化”项目 - 您必须查询新闻、事件等表格单独(或使用 ActiveRecord 不支持的 UNION)。

使用具有多态关联的 RegionLink 模型

这只是稍微复杂一点,实际上类似于 acts_as_taggable_on 的工作方式。如果您不熟悉,请查看 *belongs_to* 上的 Rails 文档以获得对多态关系的更完整描述

class Region < ActiveRecord::Base
has_many :region_links
has_many :things, :through => :region_links
end

# This table with have region_id, thing_id and thing_type
class RegionLink < ActiveRecord::Base
belongs_to :region
belongs_to :thing, :polymorphic => true
end

class Event < ActiveRecord::Base
has_one :region_link, :as => :thing
has_one :region, :through => :region_link
end

# Get all "things" (Events, Projects, etc.) from Region #1
things = Region.find(1).things

重命名非常简单 - 只需重命名区域即可。删除/重新分配区域也很简单 - 只需删除 RegionLink 记录,或替​​换它的 region_id。

如果您发现自己在 Event 等模型中复制了很多与区域相关的代码,您可能希望将其放入 lib 或 app/models 中的模块中:

module Regioned
def self.inluded(base)
base.class_eval do
has_one :region_link, :as => :thing
has_one :region, :through => :region_link
...
end
end
end

class Event < ActiveRecord::Base
include Regioned
end

class Project < ActiveRecord::Base
include Regioned
end

关于ruby-on-rails - Rails 与几乎所有其他模型的关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8871399/

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