Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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
Ruby on rails Rails 4包含并选择_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails Rails 4包含并选择

Ruby on rails Rails 4包含并选择,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我的模型是: class Person < ActiveRecord::Base has_one :archive, :dependent => :destroy class Archive < ActiveRecord::Base belongs_to :person 正如预期的那样,我只得到所有人的全名。 请注意,我使用了包含和不连接,否则没有存档的人将被排除在结果之外 然后,我尝试将存档的属性添加到select中: Person.includes(:archi

我的模型是:

class Person < ActiveRecord::Base
  has_one :archive, :dependent => :destroy

class Archive < ActiveRecord::Base
  belongs_to :person
正如预期的那样,我只得到所有人的全名。 请注意,我使用了
包含
和不
连接
,否则没有存档的人将被排除在结果之外

然后,我尝试将
存档的属性添加到select中:

Person.includes(:archive).select('persons.full_name', 'archives.title')
但我得到了这个警告:

弃用警告:您似乎急于加载字符串SQL代码段中引用的表(其中一个:Person,archives)。例如:

   Post.includes(:comments).where("comments.title = 'foo'")
当前,Active Record识别字符串中的表,并知道如何将注释表连接到查询,而不是在单独的查询中加载注释。然而,在不编写完整的SQL解析器的情况下这样做本身就是有缺陷的。因为我们不想编写SQL解析器,所以我们将删除此功能。从现在起,当您从字符串引用表时,必须显式地告诉Active Record:

   Post.includes(:comments).where("comments.title = 'foo'").references(:comments)
如果不依赖隐式连接引用,则可以通过设置
config.active\u record.disable\u implicit\u join\u references=true来完全禁用该功能。(从irb_绑定处调用(irb):125)

苏好。。我只是在我的声明末尾添加了
参考(:archive)

Person.includes(:archive).select('persons.full_name','archives.title').references(:archive)
但是现在我得到了person的所有属性和archive的无属性


我确信有一个干净简单的解决方案,但找不到。请提供一些帮助???

存在title属性,只是
inspect
的默认实现仅显示基表中的列。你可以

Person.includes(:archive).select('persons.full_name','archives.title').
                          references(:archive).collect { |p| [p.full_name, p.title]}
让自己相信这一点


如果你只需要这2个值,考虑使用<代码> PLUK/<代码>(虽然你需要在Rails 4.1上使用PLACK来返回多个列)

< P>,我想我找到了答案。 此代码适用于我:

Person.joins("LEFT JOIN archives ON persons.id = archives.person_id")
      .select('persons.full_name', 'archives.title')
到现在为止我还没有发现任何问题

(我需要使用LEFT JOIN,因为并非所有人都有档案,我仍然需要检索所有人)

顺便说一句,我使用了这个非常有用的教程,以防您想更好地理解:

此解决方案不允许将更多作用域连接到它,因为它返回一个数组。它还不错(虽然不精确-在collect循环中应该是
p.archive.title
),但我希望将其实现为作用域。正如我所说的,这个解决方案不好,因为它返回一个数组。
Person.joins("LEFT JOIN archives ON persons.id = archives.person_id")
      .select('persons.full_name', 'archives.title')