gpt4 book ai didi

ruby-on-rails - 如何使用 Arel 跨多态 has_one 关系进行查询

转载 作者:行者123 更新时间:2023-12-04 13:37:21 25 4
gpt4 key购买 nike

我目前正在开发一个具有 jquery 数据表前端的项目,并且正在使用 ajax-datatables-rails gem 来处理后端。审核后examples他们链接到并且正在面临挑战。

我有一个数据表,它显示一个表中的数据,我们称之为 Foo,它与 3 个不同的表具有 has_one 多态关系。我的搜索需要搜索该多态关系中的列。

def my_filter
->(column,value) { Arel.sql("Foo.bar.description").matches("%#{value}%")}
end

我尝试过的一件事是转换 Arel::Table (a 是 arel 表)
Foo.where(a[:id].not_eq(nil)).find(
:all,
:joins => "bar",
:conditions => ["bar.description LIKE %asd%", true]
).arel_table

但是,在这种情况下,我收到一条消息,指出它无法在 Foo 上找到 id。

最佳答案

我能想到两种方法(取决于您的 DBMS,幕后发生的事情可能几乎相同):

  • 为所有不同多态的所有相关字段创建 View bar类型
  • 加入动态创建的动态表

  • 在这两种情况下,底层逻辑都是 UNION看起来有点像下面的命令:

    SELECT foo_id, description FROM bars1
    UNION
    SELECT foo_id, description FROM bars2
    UNION
    SELECT foo_id, description FROM bars3

    在 View 的情况下,这个 UNION将构成 View 本身的内容。

    在动态表的情况下,它看起来像这样:

    SELECT foos.*, bars.*
    FROM foos
    LEFT JOIN (
    SELECT foo_id, description FROM bars1
    UNION
    SELECT foo_id, description FROM bars2
    UNION
    SELECT foo_id, description FROM bars3
    ) AS bars ON bars.foo_id = foos.id
    WHERE bars.description LIKE 'whatever%'

    看来,Arel的使用基本和平时一样,只是你要做 JOIN明确的:

    Foo.joins("LEFT JOIN bars ON bars.foo_id = foos.id").where("bars.description LIKE ?", description)

    使用动态表,我确信可以用纯 Arel 来表达它,但就我个人而言,我只想使用 SQL:

    joins_sql = <~SQL.strip_heredoc
    LEFT JOIN (
    SELECT foo_id, description FROM bars1
    UNION
    SELECT foo_id, description FROM bars2
    UNION
    SELECT foo_id, description FROM bars3
    ) AS bars ON bars.foo_id = foos.id
    SQL

    Foo.select("foos.*, bars.*").joins(joins_sql).where("bars.description LIKE ?", description)

    希望有帮助。

    关于ruby-on-rails - 如何使用 Arel 跨多态 has_one 关系进行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61020567/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com