HABTM及时回复

时间:2011-07-04 07:51:21

标签: ruby-on-rails

我正在寻找另一种方法来检查ActivityType是否有任何关系,因为我现在这样做的代价太高了( activity_type.activities.empty? )。

我考虑过创建一个新方法,例如 ActivityType#linked_to_activity? ,它会对ActivitiesActivityTypes HABTM连接表进行查询。这比前面提到的方法快,但它仍然太慢。

任何指针都受到赞赏(除了通常的“ HABTM应该被HM取代:通过”非建设性的评论)

模型

class Activity < ActiveRecord::Base
  has_and_belongs_to_many :activity_types, :uniq => true
end

class ActivityType < ActiveRecord::Base
  has_and_belongs_to_many :activities
end

查看

%table
  - @activity_types.each do |activity_type|
    %tr
      %td
        - if activity_type.activities.empty?
          Do something here...

尝试使用ActivityType#linked_to_activity?

class ActivityType < ActiveRecord::Base
  has_and_belongs_to_many :activities

  def linked_to_activity?
    ActivityType.find_by_sql(["SELECT * FROM activities_activity_types WHERE activity_type_id = ?", id]).empty? ? false : true
  end
end

NB:

  • 在Rails v2.3.5上运行
  • DB是带有外键索引的MySQL

2 个答案:

答案 0 :(得分:2)

这可以改善#linked_to_activity?

的效果
class ActivityType < ActiveRecord::Base
  has_and_belongs_to_many :activities

  def linked_to_activity?
    ActivityType.count_by_sql(["SELECT COUNT(*) FROM activities_activity_types WHERE activity_type_id = ?", id]) > 0
  end
end

答案 1 :(得分:2)

我认为你走在正确的轨道上。这是一个偏好的问题,但我通常会计算:

class ActivityType < ActiveRecord::Base
  has_and_belongs_to_many :activities

  def linked_to_activity?
    self.activities.count > 0
  end
end

修改

如下面的评论所述:使用select count(*)只会从数据库中检索一行,而select *会检索所有行(除非您最后添加limit 1)。< / p>

另外:我尽量不使用普通SQL乱丢我的模型,除非出于性能原因绝对必要。