Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Rails连接表问题_Mysql_Ruby On Rails_Join - Fatal编程技术网

Mysql Rails连接表问题

Mysql Rails连接表问题,mysql,ruby-on-rails,join,Mysql,Ruby On Rails,Join,我正在从事一个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

我正在从事一个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
以下是我的控制器的外观:

@page = Page.find(params[:id], :include => :page_translations)
那么:

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

好的,最近一段时间,ActiveRecord在连接/包含方面的行为似乎发生了变化。指南仍然提到能够做到这一点,尽管有两种关联,如
中的has\u many:orders、:include=>:line\u items
和类似的。。。但就包含来自
的记录而言,有许多
。。。咨询了一位律师后,我们遇到了一位律师。似乎单个单片查询变得太复杂和难看了,它给ActiveRecord提供的一些更高级的细节和重复行带来了问题,诸如此类的事情


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

我被同样的事情难住了,浪费了几个小时试图弄明白。事实证明,使用查询接口的
联接
方法不会初始化与被联接的表相关的模型。您可以通过在服务器控制台中查看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专家知道如何使用
连接
来填充与这些表相关的模型,请让我(我们)知道

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


更新:所以我想我刚刚找到了答案。我偶然发现了这个。事实证明,当使用查询接口的
连接
方法时,Rails实际上会将您从连接表中选择的列添加为所连接模型的属性方法

使用上面相同的例子,我实际上可以通过调用
post.category\u name
访问每篇文章的
category\u 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

我希望这有帮助!:)

它仍然只是从页面表中提取所有内容啊,这可能是因为您在
PageTranslation
中将
所属的
命名错误。您可能需要
属于:page
@thenduks,我的模型包含属于:page,我仍然没有得到查询中返回的所有内容的预期结果。这让我难以相信!我的意思很简单,我可以做两次数据库调用,但那是无效的。在你的问题中,它说
属于:pages
。。。日志上说查询是什么?我试着直接在MySQL中运行下面的查询,结果查询成功:SELECT*FROM pages LEFT JOIN pages\u translations on pages.id=pages\u translations.PAGEU\u id您期望什么?当你翻页的时候会得到什么?翻页翻译?伙计。我刚想出来!我会在下面更新我的答案…这里有一个同样的问题,答案很好:没有问题。很高兴我能帮忙在我的原始帖子末尾添加了一个更新。过来看。
[{"id": 1, "title": "joins, why have you forsaken me", "category_name": "frustration"},{"id": 2, "title": "pizza", "category_name": "food"}]
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