2015-06-21 23 views
1

我試圖將此查詢從原始SQL轉換爲Arel(6.0.0),但我遇到了在Arel重建之前從未遇到的問題從最初的版本開始。我得到的錯誤具體是:發生未定義的方法'連接'爲#<Arel :: SelectManager>

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

此錯誤是開始一個ActiveRecord joins查詢,然後追加另一個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實例。 如果任何人有興趣,這個如果用於thumbs_up寶石。

任何幫助,將不勝感激!

+0

那是一個巨大的混亂BU我相信你應該能夠簡單地通過'Vote.joins(:a,:b,:c).where(a:{some_column:'foo'})''開始。除非你有比較特殊的情況,否則你不需要告訴Rails如何創建連接查詢。變異的分配是一種不好的代碼氣味... – max

回答

2

是在阿雷爾joinjoins

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,你可以看到 - 問題是它需要在3個數據庫引擎(MySQL,Postgres和SQLite3)上工作,所以我認爲依靠Arel適當轉換SQL是一個更好的目標而不是提出3種不同的SQL語句(在這種情況下,所有語法都不相同)。 – bouchard

相關問題