Ruby on rails HABTM及时响应

Ruby on rails HABTM及时响应,ruby-on-rails,Ruby On Rails,我正在寻找另一种方法来检查ActivityType是否有任何关系,因为我现在这样做的方式太昂贵了activity\u type.activities.empty 我想创建一个新方法,比如ActivityTypelinked\u to\u activity?它将查询ActivityActivityTypes HABTM联接表。这比前面提到的方法快,但仍然太慢 除通常的HABTM外,任何指示都应通过非建设性意见替换为HM: 模型 是否尝试将活动类型链接到活动 注意: 在Rails v2.3.5上运行

我正在寻找另一种方法来检查ActivityType是否有任何关系,因为我现在这样做的方式太昂贵了activity\u type.activities.empty

我想创建一个新方法,比如ActivityTypelinked\u to\u activity?它将查询ActivityActivityTypes HABTM联接表。这比前面提到的方法快,但仍然太慢

除通常的HABTM外,任何指示都应通过非建设性意见替换为HM:

模型

是否尝试将活动类型链接到活动

注意:

在Rails v2.3.5上运行 DB是MySQL,外键上有索引
这将提高链接到活动的性能:


这将提高链接到活动的性能:


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

class ActivityType < ActiveRecord::Base
  has_and_belongs_to_many :activities

  def linked_to_activity?
    self.activities.count > 0
  end
end
编辑:

正如下面的注释所述:使用select count*只能从数据库中检索一行,而select*检索所有行,当然,除非在末尾添加限制1


另外:除非出于性能原因绝对需要,否则我尽量不在我的模型中使用纯SQL。

我认为您的思路是正确的。这是一个偏好的问题,但我通常会数一数:

class ActivityType < ActiveRecord::Base
  has_and_belongs_to_many :activities

  def linked_to_activity?
    self.activities.count > 0
  end
end
编辑:

正如下面的注释所述:使用select count*只能从数据库中检索一行,而select*检索所有行,当然,除非在末尾添加限制1


另外:除非出于性能原因绝对需要,否则我尽量不使用纯SQL来乱扔我的模型。

您可以改进答案,说明为什么“count”方法更好-说明它会自动发出SELECT count*查询,而不是使用标准SELECT*获取所有对象。谢谢,您的count 925ms建议比我的嵌入式sql 2460ms有效得多。您可以改进您的答案,告诉我为什么“count”方法更好-说明它会自动发出SELECT count*查询,而不是使用标准SELECT*获取所有对象。谢谢,您的count 925ms建议比我的嵌入式sql 2460ms有效得多。
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
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
class ActivityType < ActiveRecord::Base
  has_and_belongs_to_many :activities

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