2017-03-28 8 views
0

次のSQLをRailsクエリーで動作させようとしています。Arel:Rails用のArelコードへのSQL文の変換の助けが必要

問合せ:

select addr.* 
    from addresses addr 
    join users u 
    on addr.addressable_type = 'User' 
    and addr.addressable_id = u.id 
    join customers c 
    on c.id = u.actable_id 
    and u.actable_type = 'Customer' 
where c.account_id = 1 
    and c.site_contact = 't' 

は、これは私のRailsのコードです:

# Inside my account.rb model 
def site_addresses 
    a = Address.arel_table #Arel::Table.new(:addresses) 
    u = User.arel_table #Arel::Table.new(:users) 
    c = Customer.arel_table #Arel::Table.new(:customers) 

    # trying to debug/test by rendering the sql. Eventually, I want 
    # to return a relation array of addresses. 
    sql = Address. 
     joins(u). 
     on(a[:addressable_type].eq("User").and(a[:addressable_id].eq(u[:id]))). 
     joins(c). 
     on(c[:id].eq(u[:actable_id]).and(u[:actable_type].eq("Customer"))). 
    where(c[:account_id].eq(self.id).and(c[:site_contact].eq(true))).to_sql 

    raise sql.to_yaml #trying to debug, I'll remove this later 
    end 
end 

私は "未知のクラス:AREL ::表" のようなエラーを取得しています。私はdocsから私の答えをベース

a.join(u).on(a[:addressable_type].eq("User")... # Using the arel_table and "join" instead 

:SQLコードが有効であるため、イムは、(私がうまくデータベース上で実行することができます)

+0

まずテーブルのどこかを表すオブジェクトを作成する必要はありませんか?あなたのsite_addressesメソッドのように:アドレス= Arel :: Table.new(:アドレス)? – bkunzi01

答えて

2

次のことを試してみてください正しくARELを使用していない

users.join(photos).on(users[:id].eq(photos[:user_id])) 
+0

最初に、コードサンプルに括弧がありません。それを修正するためにあなたの答えを編集してください。第2に、これは私が必要とするものに近いですが、 'Arel :: SelectManager'オブジェクトがありますが、これを' ActiveRecord :: Relation'オブジェクトに変換してアドレスの配列を返す必要があります。あなたはそれで私を助けることができますか? – DJTripleThreat

+0

ああ申し訳ありませんが、私はちょうどコードを指摘していました。 'ActiveRecord :: Relation'を使うためには、この答えで指摘されているようにコードを書き直したいかもしれません:https://stackoverflow.com/questions/42840944/arel-active-relation-from-arelselectmanager-with-join –

+1

ありがとう!これは助けになった! – DJTripleThreat

関連する問題