私は問題がありますが、それがfind_by_sql、配列オブジェクトのあるもの、または自分のロジックであるかどうかはわかりません。次のコードはヘルパーにあります。このアプリは4象限の座標グリッドを持っています。私はアプリの名前をSomethingに置き換えたので、その参照は現時点でアプリを保護するためのものです。私はこのコードが畳み込まれている可能性があることを知っていますが、私は何かの前にまずそれを働かせたいと思いました。基本的には、問題は次のとおりです.SQLクエリを実行すると、私が期待している結果が得られます。同じ親の子である座標にヒットすると、それらのうちの1つが正しく描画されますが、削除に達すると、配列から両方の座標が削除されます。違いがある場合は、結合テーブルのIDが親座標のIDとして返されます。私は必要なものだけを選択しようとしましたが、それは助けになりませんでした(このスレッドの解決策に従って:http://www.sitepoint.com/forums/showthread.php?415007-rails-join-creates-wrong-id)。どんな助けでも大歓迎です。find_by_sqlまたは配列の問題
さらに詳述すると、象限には16の親座標があります。それが空白の場合は空白を描画し、空でない場合はすべての子を収集するdivを描画する必要があります(最初のelse ifの場合)。次に描画するはずですそこにいるすべての子供たち、そしてdivを閉めて移動しています。お役に立てれば。
def buildQuadrantForUser(options={})
buffer=""
user_coordinates = SomethingUser.find_by_sql('
Select * from something_users
inner join coordinates as a on
`something_users`.coordinate_id = `a`.id
inner join coordinates as b on
b.id = a.ancestry
Where ((user_id = '+options[:user].id.to_s+') AND (visibility = 2) AND (a.quadrant = '+options[:quadrant].to_s+'))
Order By b.number ASC
')
i=0
while i<16 do
i+=1
first = true
drawn = false
l3num = 0
user_coordinates.collect{|coor|
puts "quadrant #{options[:quadrant].to_s}"
if !coor.number.to_i.eql?(i)
puts "quadrant: #{options[:quadrant].to_s}, number: #{i.to_s}, coordinate #{coor.id}"
if drawn == false
buffer<<"<div id=q"+options[:quadrant].to_s+"_"+i.to_s+" class='l2_div sc0'>"
buffer<<"</div>"
drawn = true
end
else
puts "quadrant: #{options[:quadrant].to_s}, number: #{i.to_s}, coordinate #{coor.inspect}"
drawn = true
if first == true
buffer<<"<div id=q"+options[:quadrant].to_s+"_"+coor.number.to_s+" class='l2_div sc#{coor.coordinate.parent.percent_clicks_user_children(:user=>options[:user])}' data-value=#{coor.coordinate.parent.name} something-rating=#{coor.coordinate.parent.id.to_s}>"
first = false
end#end first
l3num = l3num + 1
if coor.coordinate.static?
if !current_user.blank? && coor.user_id == current_user.id
buffer<<content_tag(:div, content_tag(:span, "", :id=>'You'),:class=>"l3_#{l3num.to_s} cic#{coor.coordinate.percent_clicks_user(:user=>options[:user])}", :user=>'You', :somethingsomething=>coor.something_id.to_s,:something=>coor.something_id.to_s,:id=> "e" + coor.something_id.to_s, :rating=>coor.coordinate.name.to_s, :tag=>coor.something.tags.collect{|tag| tag.name+","}, :date=>time_ago_in_words(coor.updated_at), :source=>coor.something.url.split('/')[2], :link=>coor.something.url)
else
buffer<<content_tag(:div, content_tag(:span, "", :id=>coor.user.name),:class=>"l3_#{l3num.to_s} cic#{coor.coordinate.percent_clicks_user(:user=>options[:user])}", :user=>coor.user.name, :something=>coor.something_id.to_s,:id=> "e" + coor.something_id.to_s, :rating=>coor.coordinate.name.to_s, :tag=>coor.something.tags.collect{|tag| tag.name+","}, :date=>time_ago_in_words(coor.updated_at), :source=>coor.something.url.split('/')[2], :link=>coor.something.url)
end
else
l3num = l3num-1 if l3num !=0
if !current_user.blank? && coor.user_id == current_user.id
buffer<<content_tag(:div, content_tag(:span, "", :id=>'You'),:class=>"l3_5 cic#{coor.coordinate.percent_clicks_user(:user=>options[:user])}", :user=>'You', :user=>coor.something.title,:something=>coor.something_id.to_s,:id=> "e" + coor.something_id.to_s, :rating=>coor.coordinate.name.to_s, :tag=>coor.something.tags.collect{|tag| tag.name+","}, :date=>time_ago_in_words(coor.updated_at), :source=>coor.something.url.split('/')[2], :link=>coor.something.url)
else
buffer<<content_tag(:div, content_tag(:span, "", :id=>coor.user.name),:class=>"l3_5 cic#{coor.coordinate.percent_clicks_user(:user=>options[:user])}", :user=>coor.something.title, :something=>coor.something_id.to_s,:id=> "e" + coor.something_id.to_s, :rating=>coor.coordinate.name.to_s, :tag=>coor.something.tags.collect{|tag| tag.name+","}, :date=>time_ago_in_words(coor.updated_at), :source=>coor.something.url.split('/')[2], :link=>coor.something.url)
end
end#end static
buffer<<"</div>"
puts "deleting #{coor.inspect}"
user_coordinates.delete(coor)
end#end coordinate.number = i.to_s
}
end#end while
return buffer
エンド
ええ、私は本当に何をすべきか分かりません。私はそれが2つの問題の組み合わせであると考えました。私は16とコレクションの両方を反復しなければならないことを知っているので、コレクションから取り除くと、スピードアップに役立ちます。私は現在のオブジェクトが常に存在するのでdelete.at(0)を使ってみましたが、それでも私のためには動作しません。他のアイデア?どのようにIDを修正するには、削除を修正するには?私はこの数日間、これに対して頭を傷つけてきた。 – pash
selectをsomething_users。*、a.name、a.ancestry、b.idをsid、b.name、b.numberからsomething_usersに変更しました。私は今、正しいIDを取得していますが、それでもすぐに2つのオブジェクトを削除しています – pash
なぜあなたは全く削除する必要がありますか? –