未定义的方法`加入&#39;对于#<arel :: selectmanager>

时间:2015-06-21 16:46:55

标签: ruby-on-rails join activerecord arel

我试图将此查询从原始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宝石。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

Is join in Arel not 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))

答案 1 :(得分:1)

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>