ruby-on-rails – 渴望加载“有很多通过” – 我需要Arel吗?
发布时间:2020-12-17 02:15:59 所属栏目:百科 来源:网络整理
导读:我有三个表:用户,成员,项目.中间是一个连接表,表示其他两个表之间的has-many-through;它有一些感兴趣的属性,包括join_code和激活. 更广泛地: class User ActiveRecord::Base has_many :members has_many :projects,:through = :membersendclass Member Act
我有三个表:用户,成员,项目.中间是一个连接表,表示其他两个表之间的has-many-through;它有一些感兴趣的属性,包括join_code和激活.
更广泛地: class User < ActiveRecord::Base has_many :members has_many :projects,:through => :members end class Member < ActiveRecord::Base belongs_to :user belongs_to :project # has a column called join_code # has a column called activated # Note that this class can be thought of as "membership" end class Project < ActiveRecord::Base has_many :members has_many :users,:through => :members end 目标:给定一个特定的用户,我想要一个能够获得所有项目的查询,并且只需要加载将这些项目链接到用户的成员记录. 到目前为止,我在user.rb中有这个方法来执行查询: def live_projects self.projects.order("projects.name").includes(:members).where(:members => {:join_code => nil,:activated => true}) end 但这还不够.我希望能够在视图代码中执行此操作: <% current_user.live_projects.each do |project| %> <li project_id="<%= project.id %>"> <% member = project.member %> (Do something with that member record here) <%= project.name %> <% end %> </li> <% end %> 在这里,通常,我有project.members,但在我的上下文中,我只对那个链接回用户的成员记录感兴趣. 这就是我认为原始SQL应该是什么样子 select projects.*,members.* from projects inner join members on projects.id = members.project_id where members.user_id = X and members.join_code is null and members.activated = 't'; 如何在Arel(或ActiveRecord)中执行此操作? 解决方法
我可能在这里有一些答案,即我写的ActiveRecord代码似乎很合理.再次,这是查询:
def live_projects self.projects.order("projects.name").includes(:members).where(:members => {:join_code => nil,:activated => true}) end 在使用示例数据运行UI时,它会从Rails服务器生成此输出: Project Load (0.6ms) SELECT "projects".* FROM "projects" INNER JOIN "members" ON "projects".id = "members".project_id WHERE "members"."join_code" IS NULL AND "members"."activated" = 't' AND (("members".user_id = 3)) ORDER BY projects.name Member Load (2.0ms) SELECT "members".* FROM "members" WHERE ("members".project_id IN (50,3,6,37,5,1)) 然后在视图代码中我可以这样做: <% current_user.live_projects.each do |project| %> <li project_id="<%= project.id %>" class="<%= 'active' if project == @project %>"> <% member = project.members.detect { |member| member.user_id == current_user.id } %> (Do something with that member record here) </li> <% end %> 获取成员记录的表达式在视图中非常难看,但select是一个Array方法,而不是查询,除了上面显示的两个以外,没有额外的DB命中出现在Rails服务器的输出中.因此,我想我的n 1问题已经解决了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |