在Rails中添加索引有很多关系

时间:2013-09-20 22:06:59

标签: ruby-on-rails

考虑到以下关系:

class Style < ActiveRecord::Base
  has_many :stylefeatures, :dependent => :destroy
  has_many :features, :through => :stylefeatures
end

class Stylefeature < ActiveRecord::Base
  belongs_to :style
  belongs_to :feature
end

class Feature < ActiveRecord::Base
  has_many :stylefeatures, :dependent => :destroy
  has_many :styles, :through => :stylefeatures
end

如何在Style模型中最有效地添加索引以加速此方法:

  def has_feature? (arg)
    self.features.where(:name=>arg).exists?
  end

3 个答案:

答案 0 :(得分:7)

class AddIndexesToStyleFeatures < ActiveRecord::Migration
  def self.up
    add_index :stylefeatures , [:style_id , :feature_id] , :unique => true
    add_index :features , :name    # check your data before making this unique
  end

  def self.down
    drop_index :features , :name
    drop_index :stylefeatures, [:style_id , :feature_id]
  end
end

您可能希望在:features类上创建:name索引,但要注意这个问题:

如果您有包含NULL / nil字段的记录,这些字段是索引的一部分, 然后不要使用唯一索引。 =&GT;首先检查您的数据

如果在删除功能期间可能会发生StyleFeatures条目获取nil引用(而不是完全删除),那么具有唯一索引也会导致该表出现问题。

确保在查询空值时仔细检查特定数据库如何处理索引。

请参阅:Rails uniqueness constraint and matching db unique index for null column

和:How to create a unique index on a NULL column?

答案 1 :(得分:2)

我建议在unique上添加stylefeatures style_id and feature_id索引(作为数组),在unique上添加features.name索引。

答案 2 :(得分:1)

Tilo 回答的小变化:使用remove_index代替drop_index

class AddIndexesToStyleFeatures < ActiveRecord::Migration
  def self.up
    add_index :stylefeatures , [:style_id , :feature_id] , :unique => true
  end

  def self.down
    remove_index :stylefeatures, [:style_id , :feature_id]
  end
end