【问题标题】:Ruby on Rails 5 complex scope query with associationRuby on Rails 5 具有关联的复杂范围查询
【发布时间】:2017-11-07 11:53:53
【问题描述】:

我有 3 个模型产品、选项和评论。一个产品有很多选择,有很多cmets。选项属于产品,评论属于产品。

我想在 Comment 模型中创建一个范围,以获取 product_id 与 Option 模型中的 product_id 匹配的所有 cmets,然后检查 Comment 模型中的属性“message”是否像任何属于的选项到那个product_id。我有一个工人将产品变量传递给 Comments 模型。

我可以使用以下代码来接近,但我想让它动态化,而不是对查询的第二部分进行硬编码。

Comments.rb

scope :get_options, -> (product) { where(“comments.product_id = ? AND comments.message LIKE ?”), product.id, “Large Blue” } 

这里,Large Blue 是选项表中现有选项的示例。

这个范围正在模拟我试图返回的内容,但我想调用属于该产品的选项而不是硬编码它。

任何有关此问题的最佳实践的帮助将不胜感激!

谢谢

【问题讨论】:

  • 你可以从 product.options 中通过关联在范围内获取它,它返回与产品相关的所有选项......现在游戏是你的了
  • 我给你留下了答案。您能否也将ProductOptionComment 字段和关联粘贴在这里?
  • 您是说您希望能够将特定选项或其属性之一传递到范围中,并查看该产品是否有具有该选项的 cmets?或者您是否希望查看与产品关联的任何 cmets 是否具有与该产品关联的任何选项之类的消息?
  • 我正在尝试查看与产品关联的任何 cmets 是否具有与该产品关联的任何选项类似的消息。

标签: ruby-on-rails


【解决方案1】:

对于sqlite

Comment.joins(product: :options).where("comments.product_id = ? AND comments.message LIKE '%' || options.title || '%'")

我认为这应该非常接近你看起来的工作

【讨论】:

  • 谢谢!这让我很接近。有时 cmets.message 包含的内容不仅仅是 options.title 值。我想知道是否可以检查 cmets.message 中是否存在 options.title ?我试过这个 Comment.joins(product: :options).where("cmets.product_id = ? AND cmets.message LIKE '%' + 'options.title' + '%'") 但它似乎没有工作。有什么想法吗?
  • 您使用什么数据库服务器? MySQL? (更新了我对 MySQL 的回答)
  • 目前使用 sqlite3
  • 更新了我的答案。尝试并回答它是否适合您
  • 这成功了!使用 ||而不是 + 用于连接。 Comment.joins(product: :options).where("cmets.product_id = ? AND cmets.message LIKE '%' || options.title || '%'")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
相关资源
最近更新 更多