【问题标题】:rails active record to fetch result from multiple tablesrails 活动记录以从多个表中获取结果
【发布时间】:2013-10-27 05:15:33
【问题描述】:

我有以下问题

SubCategory.joins(dropdown_heads: :dropdown_lists).where(id: params[:sub_cat_id])

上面的查询生成

SELECT "sub_categories".* FROM "sub_categories" INNER JOIN "dropdown_heads" ON "dropdown_heads"."sub_category_id" = "sub_categories"."id" INNER JOIN "dropdown_lists" ON "dropdown_lists"."dropdown_head_id" = "dropdown_heads"."id" WHERE "sub_categories"."id" = 6

但我真正需要的是仅从 dropdown_headsdropdown_lists 获取记录。

我需要进行哪些修改才能实现它?

以下是关联

sub_category.rb

has_many: dropdown_heads

dropdown_head.rb

has_many: dropdown_lists
belongs_to: sub_category

dropdown_lists.rb

belongs_to: dropdown_head

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 rails-activerecord


    【解决方案1】:

    从数据库中检索 sub_category 记录

    @sub_category = SubCategory.find(params[:sub_cat_id])
    

    检索所有 dropdown_heads

    sub_category.dropdown_heads
    

    遍历 dropdown_head 以检索 dropdown_lists

    @sub_category.dropdown_heads {|dropdown_head| dropdown_head.dropdown_lists} #do whatever you want with dropdown_lists
    

    等同于:

    @sub_category.dropdown_heads.each |dropdown_head|
     dropdown_head.dropdown_lists
    end
    

    【讨论】:

    • 您只需要从控制器中获取 sub_category 即可。一旦你有了正确的 sub_category 对象,你就可以在你的视图中做剩下的事情
    • 在我看来 <%= sub_category.dropdown_heads %> 有这个但抛出异常 undefined local variable or method sub_category'`
    • 使 sub_category 成为实例变量(添加“@”前缀,请参阅我的更新答案)
    • 我无法理解您的第三个代码中发生了什么。你能解释一下吗
    • 减少SQL查询次数,可以使用eager-loading:@sub_category.dropdown_heads.includes(:dropdown_lists)
    【解决方案2】:

    您不必获取 sub_category 实例,只需调用即可

        dropdown_heads = DropdownHead.find_all_by_sub_category_id(params[:sub_cat_id])
    

    剩下的就跟@rb512说的一样了。

    【讨论】:

      【解决方案3】:

      你可以使用

      SubCategory.joins(dropdown_heads: :dropdown_lists).where(id: params[:sub_cat_id].select("dropdown_heads.dropdown_heads, dropdown_lists.dropdown_lists")
      

      你甚至可以使用rails的pluck()方法来检索特定的字段。

      【讨论】:

        猜你喜欢
        • 2016-05-27
        • 2019-03-30
        • 1970-01-01
        • 1970-01-01
        • 2019-09-08
        • 1970-01-01
        • 1970-01-01
        • 2011-04-19
        • 1970-01-01
        相关资源
        最近更新 更多