代码之家  ›  专栏  ›  技术社区  ›  dennismonsewicz

Rails连接表问题

  •  2
  • dennismonsewicz  · 技术社区  · 15 年前

    我正在从事一个rails项目,在以下方面遇到了一些问题:

    @page = Page.find(params[:id], :joins => "LEFT JOIN page_translations ON page_translations.page_id = pages.id")
    

    出于某种原因,它只是从Pages表中提取所有内容。

    这是我的佩奇模型

    class Page < ActiveRecord::Base
      has_many :users_pages
      has_many :users, :through => :users_pages
      has_many :page_translations
      has_many :categories
      accepts_nested_attributes_for :page_translations
      accepts_nested_attributes_for :categories
    end
    

    这是我的页面翻译模型

    class PageTranslation < ActiveRecord::Base
      belongs_to :pages
    end
    

    提前感谢所有的帮助!

    编辑(@thenduks)

    日志运行两个独立的查询:

    Page Load (0.5ms)  SELECT `pages`.* FROM `pages` WHERE (`pages`.`id` = 1) LIMIT 1
    
    PageTranslation Load (0.5ms) SELECT `page_translations`.* FROM `page_translations` WHERE (`page_translations`.page_id = 1)
    

    以下是我的控制器的外观:

    @page = Page.find(params[:id], :include => :page_translations)
    
    2 回复  |  直到 15 年前
        1
  •  2
  •   John    9 年前

    我被同样的事情难住了,浪费了几个小时想弄明白。事实证明,使用 joins 查询接口的方法不会初始化与要联接的表相关的模型。您可以通过在服务器控制台中查看SQL语句,甚至将ActiveRecord日志重定向到Rails控制台中的STDOUT来看到这一点。

    我是 非常 对此感到失望。这看起来不像 加入 这个方法应该行得通——这肯定不是我所期望的。我希望它能够快速加载,因为它位于Edge Guide的“快速加载”部分。

    无论如何,我不能再浪费时间去想办法了,所以我所做的就是使用 设想 查询接口,用于简单地构建我的查询 to_sql 获取查询的SQL,然后将SQL传递给 select_all ,它返回一个哈希数组,数组中的每个元素(每个哈希)代表一行。

    例子:

    query = Post.joins("LEFT JOIN categories ON post.category_id = categories.id")
    query.select("posts.*, category.category_name")
    con = ActiveRecord::Base.connection
    results = con.select_all(query.to_sql)
    

    结果:

    [{"id": 1, "title": "joins, why have you forsaken me", "category_name": "frustration"},{"id": 2, "title": "pizza", "category_name": "food"}]
    

    说实话,我仍然想确定是否有可能用我们的方式来做这件事 认为 它应该起作用,或者它的方式 应该 工作。否则,我看不出有什么理由 加入 方法,而不是帮助我们构建查询。所以如果有Rails大师知道如何使用 加入 要填充与这些表相关的模型,请让我(我们)知道!

    不管怎么说,我希望这能帮助你现在继续前进。


    使现代化 :所以我想我已经明白了。我偶然发现了这个 blog post .事实证明,当使用 加入 方法,Rails将实际添加从联接表中选择的列作为属性 方法 模型被加入反对。

    使用上面相同的例子,我实际上可以访问 category_name 只需打电话就可以看到每一篇帖子 post.category_name . #$%! 难以置信的简单,但没有任何文档!

    这又是一次:

    query = Post.joins("LEFT JOIN categories ON post.category_id = categories.id")
    query.select("posts.*, category.category_name")
    posts = query.all
    
    # access a post's category name
    puts posts[0].category_name
    
    # this is what I thought I would be able to do
    # without Rails making another query to the database
    puts posts[0].category.category_name
    

    我希望这有帮助!:)

        2
  •  0
  •   Community Mohan Dere    9 年前

    怎么样:

    Page.find( params[:id], :include => :page_translations )
    

    编辑 :

    好吧,最近一段时间,ActiveRecord在连接/包含方面的行为似乎发生了变化。指南仍然提到,通过两种关联可以做到这一点,如 has_many :orders, :include => :line_items 类似的。。。但就包括一个 has_many ... 在咨询了一位 co-worker 我们遇到了 some info on the subject 。似乎单个单一查询变得太复杂和丑陋,这给ActiveRecord提供的一些更高级的细节和重复行带来了问题,诸如此类。

    TL;医生:它不再像那样工作了。预计将有2个查询。