2015-06-21 10 views
1

Я пытаюсь преобразовать этот запрос из необработанного SQL в Arel (6.0.0), но я столкнулся с проблемами, которые у меня не было до того, как Arel был перестроен с нуля в более поздних версиях. Ошибка я получаю, в частности, является:undefined метод `joins 'для # <Arel :: SelectManager>

undefined method `joins' for #<Arel::SelectManager>

Эта ошибка возникает начинают в joins запроса ActiveRecord, а затем добавление другой joins. Любая идея, как я должен сочетать в себе соединяется с ActiveRecord (и Арел предикаты?)

Новый код:

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 Instance. Если кому-то это интересно, это если использовать в драгоценном камне thumbs_up.

Любая помощь будет оценена!

+0

То огромный беспорядок бу Я полагаю, что вы можете начать с просто 'Vote.joins (: a,: b,: c) .where (a: {some_column: 'foo'})'. Если у вас нет особых случаев, вам не нужно указывать Rails, как создавать запросы присоединения. И мутирующие настройки - плохой запах кода ... – max

ответ

2

есть в 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)) 
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>

+0

Спасибо за помощь! Это был (очень близкий) необработанный SQL, как вы можете видеть - проблема в том, что ему нужно работать с тремя механизмами DB (MySQL, Postgres и SQLite3), и поэтому я думал, что полагаться на Arel для преобразования SQL соответственно было лучшей целью чем придумать 3 разных оператора SQL (синтаксис в этом случае различен для всех 3). – bouchard