【问题标题】:An alternative to nested has many relationships嵌套的替代方案有许多关系
【发布时间】:2013-05-10 18:48:27
【问题描述】:

我正在将一个非常旧的遗留应用程序从 PHP 移植到 rails,并且遇到了一些我不确定如何以“正确”的 RoR 方式实现的功能。

基本上,我们有一个收集潜在客户的注册表单,潜在客户的属性之一是他们的居住州,例如;阿拉斯加、佛罗里达等

我们还有一些客户可以登录后端并检索潜在客户列表。这些客户的列表按状态过滤,他们的“允许”状态与他们的帐户相关联。

最初的 PHP 应用程序是在我来这里很久之前编写的,它使用一种相当复杂的方法来为客户“拥有”的每个州创建一行,这意味着对于每个拥有亚利桑那州的客户,亚利桑那州都有一行。这个状态交叉引用表变得相当大,并且在 PHP 代码基于这些查找解析客户时创建了一些令人讨厌的嵌套循环。

我想过做一个叫做States的rails模型,让一个客户有很多州,一个州有很多潜在客户关系,但一定有更好的方法。

另一种选择是将每个客户的状态列表保存为一个数组,然后将该数组保存为一行中的文本,然后使用该数组查询数据库,或者为每个客户记录的每个状态创建一行并具有每个状态都有开启或关闭状态。

我觉得我缺少 rails 的内置功能,因为这似乎是一种相当常见的关系类型。

【问题讨论】:

    标签: ruby-on-rails database model relationship


    【解决方案1】:

    我不会为客户序列化状态列表,因为这会使 SQL 查询变得困难。您最好的选择可能是在客户和状态之间创建多对多关系(allowed_states 表将包含 customer_idstate_id)。

    这样的设置可能适合您:

    class Customer < ActiveRecord::Base
      has_many :allowed_states
      has_many :states, :through => :allowed_states
    end
    
    def State < ActiveRecord::Base
      has_many :customers, :through => :allowed_states
      has_many :leads
    
    end
    
    class Lead < ActiveRecord::Base
      belongs_to :state
    
      def self.filter_allowed_for(customer)
        where(:state_id => customer.state_ids)
      end
    end
    

    通过这种方式,您可以简单地检索特定客户的已过滤潜在客户列表。请注意,客户-状态关系会在客户实例上创建一个 state_ids 方法。

    【讨论】:

    • guides.rubyonrails.org/… 啊哈!我知道有一些方法或关系可以使这更容易。我不想只为状态创建一个完整的表,但这看起来会非常有效。现在对我的潜在客户和客户模型进行适当的迁移。
    • 太棒了!很高兴我能帮忙:-)
    • 但是,我永远不需要独立访问状态...另外,这不会最终在状态表中为每个潜在客户创建一个数据库行吗?看起来 has_and_belongs_to_many 会更好。但是,您确实为我指明了正确的方向。
    • 不,状态表将不包含任何潜在客户。潜在客户表有一个state_id 字段,它是对特定状态的引用。多个潜在客户可以具有相同的state_id,因此没有冗余。是的,在这种情况下,您可以使用 has_and_belongs_to_many 关联。
    • 我知道您可能永远不需要直接访问状态表。但是,有必要使整个设置按您需要的方式工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 2021-05-25
    • 2013-08-23
    • 1970-01-01
    相关资源
    最近更新 更多