【问题标题】:Rails - Query Associated ModelsRails - 查询关联模型
【发布时间】:2017-06-02 14:21:59
【问题描述】:

我觉得这很简单,但我发现似乎没有任何效果。我正在使用带有 Rails 5 的 PostgreSQL 数据库。我需要运行一个查询来查找在 name 列中包含文本字符串或在关联模型中找到相同字符串的所有产品。这是我的模型结构。

class NormalBrand < ApplicationRecord
    has_many :normal_models
end

class NormalModel < ApplicationRecord
    belongs_to :normal_brand 
    has_many :products
end

class Product < ApplicationRecord
    belongs_to :normal_model
end

每个模型都有一个名为“名称”的字段。我正在尝试在我的产品控制器中创建一个查询,以查找在 3 个模型“名称”列中的任何一个中找到文本字符串的所有产品。像这样的...

@products = Product.where("name like lower(?)", "%#{value}%").or.where("normal_model.name like lower(?)", "%#{value}%").or.where("normal_model.normal_brand.name like lower(?)", "%#{value}%")

我知道上面的查询是完全错误的,我应该有某种连接语句,但这就是我需要帮助的地方。提前致谢。

【问题讨论】:

  • Product.joins(:normal_model).where("normal_models.name like lower(?) OR products.name like lower (?)", "%#{value}%", "%#{value}%") 试试这个

标签: ruby-on-rails ruby ruby-on-rails-5


【解决方案1】:

加入normal_modelnormal_brand就可以查询全部三个表

@products = 
  Product
  .joins(normal_model: :normal_brand)
  .where("products.name like lower(?)", "%#{value}%")
  .or.where("normal_models.name like lower(?)", "%#{value}%")
  .or.where("normal_brands.name like lower(?)", "%#{value}%")

或者只是在一个原始的地方

@products = 
  Product
  .joins(normal_model: :normal_brand)
  .where("products.name      LIKE lower(:term) OR
          normal_models.name LIKE lower(:term) OR
          normal_brands.name LIKE lower(:term)", term: "'%#{value}%'")

【讨论】:

  • 这与我需要的很接近,除了 normal_brand 是 normal_model 的父级,因此我无法进行连接。我已经在问题中发布了我的模型的结构。谢谢
  • 你可以做嵌套连接子句.joins(normal_brand: :normal_model),但它可能需要有has_many :normal_models :through =&gt; :normal_brands关联这个答案解释得更好stackoverflow.com/a/14528454/8088139
  • 我收到了这个错误。无法将“产品”加入名为“normal_brand”的关联;也许你拼错了?
  • 没有一个正常的型号属于正常的品牌如此单一
  • Cannon - 你使用的是.joins(:normal_model, :normal_brand),但你应该使用.joins(normal_model: :normal_brand)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多