加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何最好地将地址与rails中的多个型号相关联?

发布时间:2020-12-16 22:50:18 所属栏目:百科 来源:网络整理
导读:This question在SO上似乎与我的问题有关,但我不知道我的问题是如何回答的. 地址可以属于多个模型(UserProfile和Event) 实现这一点的正确方法是什么? 基本表: user_profiles(id)events(id) 实现地址表的选项: 地址(id,user_profile_id,event_id) 这种方法
This question在SO上似乎与我的问题有关,但我不知道我的问题是如何回答的.

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

user_profiles(id)
events(id)

实现地址表的选项:

>地址(id,user_profile_id,event_id)
这种方法似乎是kludgy,因为如果明天地址需要属于另一个模型,我必须添加该id字段.
此外,我还不知道,但添加一个新的id字段可能会导致一些代码
打破了吗?
>地址(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风格的多态关系创建一个db级约束.替代方案(由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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读