我正在寻找另一种方法来检查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:
答案 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乱丢我的模型,除非出于性能原因绝对必要。