ruby-on-rails – 渴望加载“有很多通过” – 我需要Arel吗?

ruby-on-rails – 渴望加载“有很多通过” – 我需要Arel吗?,第1张

概述我有三个表:用户,成员,项目.中间是一个连接表,表示其他两个表之间的has-many-through;它有一些感兴趣的属性,包括join_code和激活. 更广泛地: class User < ActiveRecord::Base has_many :members has_many :projects, :through => :membersendclass Member < A 我有三个表:用户,成员,项目.中间是一个连接表,表示其他两个表之间的has-many-through;它有一些感兴趣的属性,包括join_code和激活.

更广泛地:

class User < ActiveRecord::Base  has_many :members  has_many :projects,:through => :membersendclass 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"endclass Project < ActiveRecord::Base  has_many :members  has_many :users,:through => :membersend

目标:给定一个特定的用户,我想要一个能够获得所有项目的查询,并且只需要加载将这些项目链接到用户的成员记录.

到目前为止,我在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_IDwhere 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.nameMember 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 %>" >    <% 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问题已经解决了.

总结

以上是内存溢出为你收集整理的ruby-on-rails – 渴望加载“有很多通过” – 我需要Arel吗?全部内容,希望文章能够帮你解决ruby-on-rails – 渴望加载“有很多通过” – 我需要Arel吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1273754.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存