我有两张桌子:商店和产品。商店模型有has_many :products
,商品有belongs_to :store
我试图在rails控制台中尝试这样做:
Store.where(open: true).products.where("created_at <= ?", 1.month.ago)
并得到错误(稍微复述):NoMethodError: undefined method products for #<Store
答案 0 :(得分:2)
不是一件容易的事情 - products
是在Store
的实例上定义的方法,您在关系上调用它。我可能会选择:
Product.where(store_id: Store.where(open:true).pluck(:id)).where("created_at <= ?", 1.month.ago)
这将生成两个db调用,但也返回一个干净且易于查询的范围。另一种方法是使用join:
Product.joins(:store).where(store: { open: true }).where("created_at <= ?", 1.month.ago)
这将使用一个查询来完成工作,但由于连接,很容易轻松地操作生成的范围。
答案 1 :(得分:2)
你倒退了。由于您可以拥有多个商店,因此Rails不会返回open: true
的所有商品。
您需要加入并查找商店开放的产品。
Product.joins(:store).where(store: {open: true}).where("created_at <= ?", 1.month.ago)