5

考虑到以下关系:

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
4

3 回答 3

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 字段,则不要使用唯一索引。=> 首先检查您的数据

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

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

请参阅:Rails 唯一性约束和匹配空列的 db 唯一索引

和:如何在 NULL 列上创建唯一索引?

于 2013-09-20T22:19:25.493 回答
2

我建议在(作为数组)上添加unique索引和在.stylefeatures style_id and feature_iduniquefeatures.name

于 2013-09-20T22:09:59.247 回答
1

蒂洛回答的小改动:使用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
于 2014-10-05T17:55:27.660 回答