【问题标题】:Rails Join Query with scopesRails 使用范围加入查询
【发布时间】:2013-09-26 22:00:31
【问题描述】:

我正在处理我的第一个 Rails 项目,我一直试图让我的两个模型一起工作。这是我的模型:

class Ecn < ActiveRecord::Base
  has_many :revisions, :dependent => :destroy
  has_many :drawings, through: :revisions
  accepts_nested_attributes_for :revisions, :reject_if => lambda { |attrs| attrs.all? { |key, value| value.blank? }}, :allow_destroy => true
  belongs_to :user

class Drawing < ActiveRecord::Base
  has_many :revisions

class Revision < ActiveRecord::Base
  belongs_to :drawing, foreign_key: :drawing_number
  belongs_to :ecn

我想要实现的是使用修订foreign_key :drawing_number 搜索Ecns。当我创建 Ecn 时,我向 Ecn 添加了多个修订,其中有一个字段:drawing_number,这是 Drawings 的一个属性。我有一个 Ecn 搜索表单,它有多个要搜索的字段,其中之一是:drawing_number。我希望查询找到包含给定 :drawing_number 的所有修订,并找到包含这些修订的 Ecn。

我的 Ecn 模型中的范围如下所示:

scope :by_drawing_number, lambda { |drawing_number| Ecn.joins(:drawings).where("drawings.drawing_number LIKE ?",  "%#{drawing_number}%") unless drawing_number.nil? }

此范围不会引发任何错误,但搜索结果为零。

【问题讨论】:

  • 你能发布正在执行的查询吗?
  • Revision Load (0.4ms) SELECT "revisions".* FROM "revisions" WHERE (drawing_number LIKE '%A9999%') Ecn Load (0.4ms) SELECT "ecns".* FROM "ecns" WHERE "ecns"."id" = 16 LIMIT 1 Ecn Load (0.3ms) SELECT "ecns".* FROM "ecns" WHERE "ecns"."id" = 23 LIMIT 1 Ecn Load (0.4ms) SELECT "ecns".* FROM "ecns" WHERE "ecns"."ecn_number" = 0
  • 此查询是使用下面 mattherick 发布的范围生成的。

标签: ruby-on-rails ruby ruby-on-rails-3 sqlite search


【解决方案1】:

以下应该是可能的:

scope :by_drawing_number, lambda { |drawing_number| Revision.where("drawing_number LIKE ?", "%#{drawing_number}%").map(&:ecn)

这将返回一个 Ecns 的集合。

【讨论】:

  • 这仍然没有加载任何 Ecns,我在 cmets 中发布了上面的结果查询。
  • 您确定您的数据库条目是正确的吗?我在我的一个项目中尝试了我的查询,也有很多通过关系..它有效。
  • 你可能是对的。我不确定我的模型是否正确相互关联(例如,我可以使用 :drawings 中不存在的 drawing_number 创建一个 :revision)。我得做更多的测试才能看到。我不知道在搜索中使用“地图”方法。看起来应该可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-15
  • 2021-07-02
  • 1970-01-01
  • 2012-09-28
  • 2021-04-10
  • 1970-01-01
相关资源
最近更新 更多