【发布时间】:2014-02-18 18:18:43
【问题描述】:
我有 3 个模型如下: (我也在描述数据库结构,以防不熟悉 RubyOnRails 的人能够帮助我)
Thread.rb
class Thread
has_many :thread_profils
has_many :profils, :through => :thread_profils
end
表线程
integer: id (PK)
ThreadProfil.rb
class ThreadProfil
belongs_to :thread
belongs_to :profil
end
表thread_profiles
integer: id (PK)
integer: thread_id (FK)
integer: profil_id (FK)
Profil.rb
class Profil
end
表格配置文件
integer: id (PK)
在我的一个控制器中,我正在寻找最优化的方法来查找包含完全两个配置文件的线程 ID(当前一个,另一个) :
我得到了我的current_profil.id 和另一个profil.id,但我想不出一种简单的方法来获取Thread.id 的集合/列表/数组,同时处理较少的 SQL 请求。
目前我找到的唯一解决方案是以下解决方案,我根本不认为它是“优化”的。
thread_profils = ThreadProfil.where(:profil_id => current_profil.id)
thread_ids = thread_profils.map do | association |
profils = Thread.find(association.thread_id).profils.map do | profil |
profil.id if profil.id != current_profil.id
end.compact
if (profils - [id]).empty?
association.thread_id
end
end.compact
即处理以下 SQL 查询:
SELECT `thread_profils`.* FROM `thread_profils` WHERE `thread_profils`.`profil_id` = [current_profil.id]
对于每个结果:
SELECT `threads`.* FROM `threads` WHERE `threads`.`id` = [thread_id] LIMIT 1
SELECT `profils`.* FROM `profils` INNER JOIN `thread_profils` ON `profils`.`id` = `thread_profils`.`profil_id` WHERE `thread_profils`.`thread_id` = [thread_id]
是否有任何简便的方法可以做到这一点,无论是使用 rails 还是直接使用 SQL ?
谢谢
【问题讨论】:
标签: mysql sql ruby-on-rails ruby model