【问题标题】:undefined method `joins' for #<Arel::SelectManager>#<Arel::SelectManager> 的未定义方法“joins”
【发布时间】:2015-06-21 16:46:55
【问题描述】:

我正在尝试将此查询从原始 SQL 转换为 Arel (6.0.0),但我遇到了在 Arel 在更高版本中从头开始重建之前从未遇到过的问题。具体来说,我遇到的错误是:

undefined method `joins' for #&lt;Arel::SelectManager&gt;

此错误发生在启动 ActiveRecord joins 查询,然后附加另一个 joins。知道我应该如何将连接与 ActiveRecord(和 Arel 谓词)结合起来吗?

新代码:

v = o.joins(Vote.table_name).on(Vote.arel_table[:voteable_type].eq(o.to_s).and(Vote.arel_table[:voteable_id].eq(o.arel_table[o.primary_key])))
        v = v.joins(self.class.base_class.table_name).on(self.base_class.arel_table[self.class.base_class.primary_key].eq(o.arel_table[p[0]]))
        v = v.where(self.class.base_class.areal_table[self.class.base_class.primary_key].eq(self.id))

转换自:

v = o.where(["#{self.class.base_class.table_name}.#{self.class.base_class.primary_key} = ?", self.id])
v = v.joins("INNER JOIN #{Vote.table_name} ON #{Vote.table_name}.voteable_type = '#{o.to_s}' AND #{Vote.table_name}.voteable_id = #{o.table_name}.#{o.primary_key}")
v = v.joins("INNER JOIN #{self.class.base_class.table_name} ON #{self.class.base_class.table_name}.#{self.class.base_class.primary_key} = #{o.table_name}.#{p[0]}")

o 是一个 ActionModel 实例。 如果有人感兴趣,可以在thumbs_up gem 中使用。

任何帮助将不胜感激!

【问题讨论】:

  • 那是一团糟,但我相信您应该可以从 Vote.joins(:a, :b, :c).where(a: { some_column: 'foo'}) 开始。除非您有相当特殊的情况,否则您不需要告诉 Rails 如何创建连接查询。变异分配是一种不好的代码气味......

标签: ruby-on-rails join activerecord arel


【解决方案1】:

Arel 中的 join 不是 joins

vote_t = Vote.arel_table    
other_t = self.class.base_class.arel_table
v = o.join(vote_t).on(vote_t[:voteable_type].eq(o.to_s).and(vote_t[:voteable_id].eq(o.arel_table[o.primary_key])))
v = v.join(other_t).on(other_t[self.class.base_class.primary_key].eq(o.arel_table[p[0]]))
v = v.where(other_t[self.class.base_class.primary_key].eq(self.id))

【讨论】:

    【解决方案2】:
    v = o.joins(Vote.table_name).on(Vote.arel_table[:voteable_type].eq(o.to_s).and(Vote.arel_table[:voteable_id].eq(o.arel_table[o.primary_key])))
    

    从外观上看,您的第一行以o 开头,我猜这是ActiveRecord 模型的某种类型。 ActiveRecord defines the joins method as you already know.

    但是第一行的输出不是另一个ActiveRecord 模型,而是Arel::SelectManager 的一个实例。那么问题是没有为该实例定义joins,而是您想要join method

    由于您的代码缺乏详细信息,因此很难确定除此之外的任何内容(如果您可以提供更多详细信息,我可能会扩展我的答案。)

    &lt;opinion&gt;如果我偶然发现任何一段代码,我可能会尝试用原始 SQL 写出来,因为这两个例子都很难理解&lt;/opinion&gt;

    【讨论】:

    • 感谢您的帮助!如您所见,它(非常接近)原始 SQL - 问题是它需要在 3 个数据库引擎(MySQL、Postgres 和 SQLite3)上工作,所以我认为依靠 Arel 适当地转换 SQL 是一个更好的目标而不是提出 3 个不同的 SQL 语句(在这种情况下,所有 3 个的语法都不同)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多