Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.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 Postgres/ActiveRecord bug?_Ruby On Rails_Postgresql_Activerecord - Fatal编程技术网

Ruby on rails Postgres/ActiveRecord bug?

Ruby on rails Postgres/ActiveRecord bug?,ruby-on-rails,postgresql,activerecord,Ruby On Rails,Postgresql,Activerecord,我在ActiveRecord中使用了以下方法,并详细介绍了一些简化的类/关联: class LineItem < ApplicationRecord has_many :line_item_parts def media best = line_item_parts.detect do |part| part.part.medias.any? end best_media = best && best.part.medias.f

我在ActiveRecord中使用了以下方法,并详细介绍了一些简化的类/关联:

class LineItem < ApplicationRecord
  has_many :line_item_parts

  def media
    best = line_item_parts.detect do |part|
      part.part.medias.any?
    end
    best_media = best && best.part.medias.first
    best_media || product.medias.first
  end
end

class LineItemPart < ApplicationRecord
  belongs_to :line_item
  belongs_to :part
end

class Part < ApplicationRecord
  belongs_to :product
  has_many :medias
end

class Media < ApplicationRecord
  belongs_to :product
  belongs_to :part, optional: true
end
手动执行查询将返回预期的媒体结果。在第二次运行时,它是相同的查询,但使用AR的
缓存
,但在第二次运行时,它返回正确的结果(非nil媒体对象)

这怎么可能?这是一个ActiveRecord错误吗?我甚至不知道从哪里开始用谷歌搜索这样的东西

宝石:

  • 轨道(5.1.5)
  • pg(0.21.0)
Postgres版本:
psql(PostgreSQL)10.2(Debian 10.2-1.pgdg90+1)


在Docker for Mac中运行。

我没有看到错误,但看起来它仍然会导致几个查询。我可以建议一个替代方案吗

 def media
   best_media = Media
      .joins(parts: [line_item_parts: :line_items])
      .where('line_items.id = ?', id)
      .first
   best_media || product.medias.first
 end
如果您想继续直接使用关联,您可以尝试在枚举器方法之前添加
,以便显式操作结果

def media
  best = line_item_parts.to_a.detect do |lip|
    lip.part.medias.any?
  end
  best_media = best && best.part.medias.first
  best_media || product.medias.first
end

你能把这些课程贴出来让我们了解所有的东西吗?至少我们需要名字和关系。@JacobVanus完成!很抱歉。你是说LineItemPart
有很多:媒体,通过::part
?@pdobb很好!实际上,我并没有在代码中声明这种关系。我也把其他的关联弄清楚了一点。另外:这只发生在
rails服务器的
过程中。在
rails控制台
中,
configuration#media
方法似乎在100%的时间内都能工作(使用相同的配置ID)。
 def media
   best_media = Media
      .joins(parts: [line_item_parts: :line_items])
      .where('line_items.id = ?', id)
      .first
   best_media || product.medias.first
 end
def media
  best = line_item_parts.to_a.detect do |lip|
    lip.part.medias.any?
  end
  best_media = best && best.part.medias.first
  best_media || product.medias.first
end