【问题标题】:Rails 3 Finding A Child's Grandparent Through It's Other ParentRails 3 通过另一个父母找到孩子的祖父母
【发布时间】:2012-06-21 22:03:44
【问题描述】:

如何在 Ruby on Rails 中查询横向祖父母?

例如,我有以下模型设置:

用户

class User < ActiveRecord::Base
   has_many :registrations
end

注册

class Registration < ActiveRecord::Base
   belongs_to :user
   belongs_to :competition
end

比赛

class Competition < ActiveRecord::Base
  has_many :registrations
  belongs_to :tournament
end

锦标赛

class Tournament < ActiveRecord::Base
  has_many :competitions
end

所以我想做的是找到所有注册属于特定锦标赛用户。我知道的唯一方法是找到所有用户,遍历每个用户,然后像这样查询每个用户的个人注册......

<% @users.each do |user| %>
    <% if user.registrations..joins(:competition).where("competitions.tournament_id = #{params[:tournament]}").count > 0 %>
        print out user information...
    <% end %>
<% end %>

这似乎是一种真正的半知半解的做事方式,因为我正在选择我不需要的记录,任何人都可以建议一种更好的更 Railsy 的方式来完成这个吗?

【问题讨论】:

    标签: ruby-on-rails-3 activerecord polymorphic-associations


    【解决方案1】:

    创建更“Railsy”解决方案的第一步是将查询逻辑移出视图并移入模型层。您可以将这两个查询添加到您的锦标赛模型中:

    class Tournament < ActiveRecord::Base
      has_many :competitions
    
      def registrations
        regs = []
        self.competitions.each do |competition|
          competition.registrations.each do |registration|
            regs << registration
          end
        end
        regs
      end
    
      def users
        usrs = []
        self.registrations.each do |registration|
          usrs << registration.user
        end
        usrs
      end
    
    end
    

    现在您可以在视图中:

    <% @tournament.users.each do |user| %>
      User: <%= user.name %><br />
    <% end %>
    

    如果您需要,您还有一个方法可以返回锦标赛中的所有注册信息。希望这可以帮助您了解另一种方法。

    【讨论】:

    • 您好,唐,谢谢您的回复。我尝试了您的代码,但用户方法返回此错误消息:undefined method user' for #<:relation:0x00000005030700>`。我认为这是因为比赛有很多注册。
    • 是的,我认为你是对的。我修改了代码,以便将每个竞赛的注册单独添加到“regs”数组(而不是注册数组)。您应该能够访问“用户”以获取个人注册记录。
    • 虽然有一个问题 - 这是一种额外的问题,但并不重要(如果需要,我会提出一个新问题)。您的解决方案返回一个数组,我们是否有机会返回一个关系,以便我对返回的用户应用额外的约束?
    • 我不擅长 ActiveRecord 查询,无法告诉您如何将结果作为关系返回。不久前,我就如何对数组中的结果进行排序提出了一个相关问题。我从@DGM 得​​到的答案显示了如何操作数组。 (您可以查看 Ruby 数组方法,看看您是否可以这样做。)他还给了我一个示例,说明如何通过 DB 查询实现我想要的。这部分答案可能会帮助您绕过数组方法:stackoverflow.com/questions/9847855/…
    • 我想我现在会满足于数组,等到扩展的时候我会想办法把它变成一个查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    相关资源
    最近更新 更多