【问题标题】:Rails has many and dynamic conditions clauseRails 有许多动态条件子句
【发布时间】:2015-06-19 21:10:31
【问题描述】:

我正在尝试在 2 个模型之间创建一个多关联,为此我需要一个动态条件:

class User
    has_many :all_cars, ->(user) {where("cars.owner1_id=? OR cars.owner2_id=?", user.id, user.id)}, class_name: "Car"
end

我希望 has_many 关联生成类似:

SELECT "cars".* FROM "cars" WHERE (cars.owner1_id=1 OR c.owner2_id=1)

但是rails创建:

SELECT "cars".* FROM "cars" WHERE "cars"."owner_id" = ? AND (cars.owner1_id=1 OR cars.owner2_id=1)

因为owner_id字段不存在,显然会报错。

我也试过了

class User
    has_many :all_cars, ->(user) {where("cars.owner2_id=?", user.id, user.id)}, class_name: "Car", foreign_key: "owner1_id"
end

生成

SELECT "cars".* FROM "cars" WHERE "cars"."owner1_id" = 1 AND (cars.owner2_id=1)

但我需要使用OR 而不是AND

在使用动态条件时,如何使用覆盖WHERE 子句的块而不是添加到现有的块?

谢谢

【问题讨论】:

  • 试试这个has_many :all_cars, ->(user) {where('cars.owner1_id = :q OR cars.owner2_id = :q, q: user.id) }, class_name: "Car"
  • 它给出了同样的错误,你需要传递对象来访问 lambda 中的 id

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord rails-activerecord


【解决方案1】:

不要使用.has_many,而是定义一个简单的方法:

class User < ActiveRecord::Base
  def all_cars
    Car.where("cars.owner1_id = ? OR cars.owner2_id = ?", id, id)
  end
end

【讨论】:

    猜你喜欢
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    相关资源
    最近更新 更多