gpt4 book ai didi

ruby-on-rails - 如何最好地将地址关联到 rails 中的多个模型?

转载 作者:行者123 更新时间:2023-12-04 01:40:34 26 4
gpt4 key购买 nike

This question在 SO 上似乎与我的问题有关,但我不确定我的问题是否得到了回答。

一个地址可以属于多个模型(UserProfile 和 Event)
实现这一点的正确方法是什么?
基本表:

user_profiles(id)
events(id)

实现地址表的选项:
  • addresses(id,user_profile_id,event_id)这种方法似乎很笨拙,因为如果明天地址需要属于另一个模型,我必须添加该 id 字段。
    另外,我还不知道,但是添加一个新的 id 字段可能会导致一些代码
    打破为好?
  • addresses(id,model_type,model_id)这是多态的,对吧。我不知道为什么,但我以某种方式对此感到警惕?
  • 其他一些方法来做到这一点?

  • 笔记:

    我可以像这样制作表格,我想:
    user_profiles(id,address_id)
    events(id,address_id)

    但是,这意味着相同的 address_id可以属于不同的型号。
    我想不应该这样,因为比如说需要更改事件的地址,但它不应该影响 user_profile 的地址。 .
    所以这将是这样的(我认为这是错误的):
    @current_user_profile.address = some_new_address
    #this would have changed the address for both the user_profile *and* the event
    @current_user_profile.save

    最佳答案

    一种方法是标准的 Rails 多态性:

    class Address
    belongs_to :addressable, :polymorphic => true
    end

    class UserProfile
    has_one address, :as => :addressable
    end

    class Event
    has_one address, :as => :addressable
    end

    您对此可能有一种唠叨的感觉,即您无法使用 Rails 样式的多态关系创建数据库级约束。另一种选择(由 Dan Chak 在 Enterprise Rails 中建议)就像您的#1 选项,您确实为每种类型的关系创建了一个单独的 id 字段。这确实会留下未使用的字段,但它也允许约束。我可以看到两者的论点,但 Rails 社区使用 AR 多态已经有一段时间了,显然取得了不错的成功。我毫不犹豫地使用它。但是,如果这让您感到困扰,您可以使用 Chak 的方法。还有很多工作要做。 :)

    编辑:@Slick86,迁移看起来像:
    class CreateAddresses < ActiveRecord::Migration
    def change
    create_table :addresses do |t|
    t.integer :addressable_id
    t.string :addressable_type
    end
    end
    end

    关于ruby-on-rails - 如何最好地将地址关联到 rails 中的多个模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3926516/

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