【问题标题】:Ultra-grand super acts_as_tree rails queryUltra-grand superacts_as_tree rails 查询
【发布时间】:2010-11-20 20:10:55
【问题描述】:

现在我正在处理一个关于通过 rails 进行激烈的acts_as_tree MySQL 查询的问题。我查询的模型是FooFoo 可以属于CityStateCountry 中的任何一个。我的目标是根据他们的位置查询Foos。我的位置表是这样设置的:

  • 我的数据库中有一个名为locations 的表
  • 我使用acts_as_tree 和多态关联的组合将每个单独的位置存储为CityStateCountry。 (这意味着我的表由idnameparent_idtype 行组成)

比如说,我想在“加利福尼亚”州查询Foos。除了直接属于“加利福尼亚”的Foos 之外,我应该得到属于“加利福尼亚”中每个City 的所有Foos,例如“洛杉矶”和“旧金山”中的Foos。不仅如此,我还应该得到属于“California”所在的Country、“United States”的任何Foos。

我已经尝试了一些与关联无济于事的事情。我觉得我在这里错过了一些超级有用的 Rails-fu。有什么建议吗?

【问题讨论】:

    标签: ruby-on-rails ruby mysql


    【解决方案1】:

    我相信您现在已经找到了解决方案....

    对于这样的事情,我发现我诉诸于非规范化祖先及其他地方。虽然它不是最佳的数据库实践,但它使用例更容易,只需一点点开销。

    因此,例如,您的位置表将有一个 city_id、state_id 和 country_id 列,并且在类型为“州”的情况下,city_id 为空。并且对于 type="country" city_id 和 state_id 为空。然后,在任何时候,查找给定节点的所有子节点的查询都很简单,您只需要知道您所追求的节点类型即可。

    一个简单的 before_save 可以进行反规范化。

    belongs_to :city, :class_name => "Location", :foreign_key => :city_id
    belongs_to :state, :class_name => "Location", :foreign_key => :state_id
    belongs_to :country, :class_name => "Location", :foreign_key => :country_id
    
    #might want to throw in some validation that one of the ids is set...
    def before_save
      self.state_id = self.city.state_id if city_id && city
      self.country_id = self.state.country_id if state_id && state
    end
    

    或者,您可能希望查看嵌套集实现之类的内容,通过添加两个整数字段(左和右),您可以获取层次结构中任何节点的所有子节点,我最喜欢的是http://github.com/collectiveidea/awesome_nested_set

    【讨论】:

      猜你喜欢
      • 2021-10-16
      • 2021-09-28
      • 1970-01-01
      • 2016-04-28
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多