嵌套的替代方法有很多关系

时间:2013-05-10 18:48:28

标签: ruby-on-rails database model relationship

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

基本上我们有一个收集引线的注册表单,其中一个引线的属性是居住的状态,例如;阿拉斯加州,佛罗里达州等。

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

我来到这里之前写的原始PHP应用程序使用了一种相当复杂的方法,即为客户的每个州“拥有”排队,这意味着亚利桑那州每个拥有亚利桑那州的客户都有一排。这状态交叉引用表变得相当大,并且它创建了一些讨厌的嵌套循环,因为PHP代码根据这些查找解析客户。

我想过将轨道模型称为状态,并使客户拥有许多状态,并且状态有很多引导关系,但必须有更好的方法。

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

我觉得我缺少一个内置的rails功能,因为这似乎是一种相当普遍的关系。

1 个答案:

答案 0 :(得分:0)

我不会为客户序列化状态列表,因为这会使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方法。