【问题标题】:Relationships between models with no IDs没有 ID 的模型之间的关系
【发布时间】:2016-02-19 17:54:56
【问题描述】:

所以我继承了一个使用 SQL Server 的数据库和 .NET 项目。我们需要通过 Rails 连接到它。

问题是数据库设计得不是很好,关系不存在(外键等)

有没有办法通过没有 ID 字段或明确“关系”的模型来关联表格?以这些表格为例:

Lunches (table)
---------------
Lunch_Guid (PK, varchar(32), not null)
Lunch_Name (varchar(50), not null)
Lunch_Key (varchar(50), not null) -- UrlSafe_base64 random string
....

Foods (table)
-------------
Food_Guid (PK, varchar(32), not null)
Food_Name (varchar(50), not null)
Food_Key (varchar(50), not null) -- UrlSafe_base64 random string

....

Tray (table)
------------
Tray_Guid (PK, varchar(32), not null)
Item_Key (varchar(50), null) -- "Make-shift relationship."
Tray_Key (varchar(50), not null) -- UrlSafe_base64 random string
...

在给我的规格中,我需要拉出所有带有相应午餐的托盘。 Item_Key “似乎”是与Lunches 表的“关系”(可能存在也可能不存在)。但是,有人告诉我,Item_Key 也可以容纳单个 Food 项目。

如您所见,没有“明确”指示 Item_Key 包含什么(Lunches 表中没有类型字段)。但是,我希望能够使用 Rails 的模型结构来处理。

顺便说一句,我无论如何都无法更新表格以适应 Rails。

这可能吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 rails-activerecord


    【解决方案1】:

    您可以配置关联以使用不同的键。听起来您可以定义两种关联:一种假设Item_Key 指向Lunches.Lunch_Key,另一种假设Item_Key 指向Foods.Food_Key。然后,您可以使用一种方法来确定要遵循哪个关联(您需要确定哪个优先级,因为您不知道 Item_Key 将唯一指向午餐或食物。

    class Tray < ActiveRecord::Base
      has_one :food, foreign_key: 'Item_Key', primary_key: 'Food_Key'
      has_one :lunch, foreign_key: 'Item_Key', primary_key: 'Lunch_Key'
    
      def content_name
        if self.food.present?
          self.food.Food_Name
        elsif self.lunch.present?
          self.lunch.Lunch_Name
        else
          nil
        end
      end
    

    您始终可以在 LunchFood 类中提供 name 方法,这可能会使事情变得更容易。

    附:我并不是在假装你没有进入一个痛苦的世界,试图让这样的模式与 ActiveRecord 一起工作。

    【讨论】:

    • 为了稍微扩展一下,我在同一个项目中有另一组类似的表。但是,另一个表在同一个表中有一个 _Key 和字段,具有讽刺意味的是 _Guid 关系(没有 FK)。在上面的答案中,您显示了 has_one 关系。我是否能够与同一张表建立多个关系但使用不同的 FK/PK 设置?说一个通过 _Guid “关联”,另一个通过 _Key 字段关联但与相同的两个表?这个数据库设计得很糟糕,但我试图证明 Rails 比他们目前使用的数据关系更好。
    • 是的,你可以叫它别的名字:has_one :keyed_food, class_name: 'Food', foreign_key: 'Item_Key', primary_key: 'Food_Guid'。希望答案有用。
    猜你喜欢
    • 1970-01-01
    • 2014-12-02
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    相关资源
    最近更新 更多