【发布时间】:2015-06-21 16:46:55
【问题描述】:
我正在尝试将此查询从原始 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 中使用。
任何帮助将不胜感激!
【问题讨论】:
-
那是一团糟,但我相信您应该可以从
Vote.joins(:a, :b, :c).where(a: { some_column: 'foo'})开始。除非您有相当特殊的情况,否则您不需要告诉 Rails 如何创建连接查询。变异分配是一种不好的代码气味......
标签: ruby-on-rails join activerecord arel