【问题标题】:Defining an order to a set of associated records为一组关联记录定义订单
【发布时间】:2016-08-23 12:35:09
【问题描述】:

我有两个模型,任务和单元。一个任务 has_many :units。我想根据某种优先级订购单位。例如:有两个单元 A 和 B。A 必须在 B 之前完成。用户可以在 A 和 B 之间添加另一个单元,例如 C。然后也可以删除单元 C - A 和 B 的优先级将保持不变。在 Rails 中实现这一点的最简单/直接的方法是什么?

我考虑过的想法:

  1. 向单位表中添加一个优先整数列,该列在更改单位集合的任何操作上都会得到更新。

  2. 将自连接关联添加到指向下一个/上一个单元的单元模型,并在单元集合更改时修改关联。

【问题讨论】:

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


    【解决方案1】:

    您可以使用acts_as_votable gem。 此迁移可以解决您的问题:

    class AddCachedVotesToPosts < ActiveRecord::Migration
      def self.up
        add_column :posts, :cached_votes_total, :integer, :default => 0
        add_column :posts, :cached_votes_score, :integer, :default => 0
        add_column :posts, :cached_votes_up, :integer, :default => 0
        add_column :posts, :cached_votes_down, :integer, :default => 0
        add_column :posts, :cached_weighted_score, :integer, :default => 0
        add_column :posts, :cached_weighted_total, :integer, :default => 0
        add_column :posts, :cached_weighted_average, :float, :default => 0.0
        add_index  :posts, :cached_votes_total
        add_index  :posts, :cached_votes_score
        add_index  :posts, :cached_votes_up
        add_index  :posts, :cached_votes_down
        add_index  :posts, :cached_weighted_score
        add_index  :posts, :cached_weighted_total
        add_index  :posts, :cached_weighted_average
    
        # Uncomment this line to force caching of existing votes
        # Post.find_each(&:update_cached_votes)
      end
    
      def self.down
        remove_column :posts, :cached_votes_total
        remove_column :posts, :cached_votes_score
        remove_column :posts, :cached_votes_up
        remove_column :posts, :cached_votes_down
        remove_column :posts, :cached_weighted_score
        remove_column :posts, :cached_weighted_total
        remove_column :posts, :cached_weighted_average
      end
    end
    

    尤其是此列add_column :posts, :cached_votes_up, :integer, :default =&gt; 0 和此索引add_index :posts, :cached_votes_score

    【讨论】:

      【解决方案2】:

      对问题建模的正确方法取决于任务结构的复杂程度。

      如果一个任务的单位总是可以按从前到后的顺序排列,那么给每个单位一个整数顺序将更容易将单位按该顺序排列,order 在 ActiveRecord 中或sort 在内存中。唯一的缺点是当您添加或删除一个单位时,您可能需要保存其他单位来更新他们的订单。如果任务具有较小的整数单位数,这可能不是一个很大的缺点。

      如果一个任务可以有循环,每个单元都需要引用它之前的单元。你甚至可能最终需要一个模型来表示一个单元和它后面的单元之间的关系。因此,请仔细考虑您期望需要支持的用例,看看哪些适用。

      【讨论】:

      • 感谢您的见解。我喜欢将 ActiveRecord 用于订单和处理循环任务的想法。由于我不必处理循环任务,我将使用整数列。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      相关资源
      最近更新 更多