#<Arel::SelectManager> 的未定义方法“joins”
undefined method `joins' for #<Arel::SelectManager>
我正在尝试将此查询从原始 SQL 转换为 Arel (6.0.0),但我 运行 遇到了在从地面重建 Arel 之前我从未遇到过的问题在以后的版本中。我收到的错误具体是:
undefined method `joins' for #<Arel::SelectManager>
此错误发生在启动 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.
如有任何帮助,我们将不胜感激!
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.
由于您的代码缺乏详细信息,因此很难确定除此之外的任何内容(如果您可以提供更多详细信息,我可能会扩展我的答案。)
<opinion>
如果我偶然发现其中任何一段代码,我可能会尝试将其写成原始代码 SQL,因为这两个示例都很难理解 </opinion>
阿雷尔的 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))
我正在尝试将此查询从原始 SQL 转换为 Arel (6.0.0),但我 运行 遇到了在从地面重建 Arel 之前我从未遇到过的问题在以后的版本中。我收到的错误具体是:
undefined method `joins' for #<Arel::SelectManager>
此错误发生在启动 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.
如有任何帮助,我们将不胜感激!
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.
由于您的代码缺乏详细信息,因此很难确定除此之外的任何内容(如果您可以提供更多详细信息,我可能会扩展我的答案。)
<opinion>
如果我偶然发现其中任何一段代码,我可能会尝试将其写成原始代码 SQL,因为这两个示例都很难理解 </opinion>
阿雷尔的 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))