find_by_sql或数组问题

我有问题,我不能告诉它是否与find_by_sql,某些与数组对象,或我的逻辑。以下代码在助手中。这个应用程序有4个象限的坐标网格。我用Something替换了应用程序名称,所以任何引用都是为了保护应用程序。我知道这段代码可能很复杂,但我想在其他任何事情之前先让它工作。基本上,问题是这样的:当我运行SQL查询时,我得到了我期待的结果。当它碰到同一个父对象的坐标时,它会正确地绘制其中的一个坐标,但当它到达该删除点时,它将从该数组中删除两个坐标。如果它有所不同,则连接表ID将返回为父坐标的ID。我试着只选择我需要的东西,但没有帮助(根据该线程的解决方案:http://www.sitepoint.com/forums/showthread.php?415007-rails-join-creates-wrong-id)。任何帮助将不胜感激。find_by_sql或数组问题

为了进一步阐述,在象限中有16个父坐标。如果它是空白的,我们绘制一个空白的(如第一个if),如果它不是空白的,我们必须绘制一个div来收集所有的孩子(首先是其他的),然后,我们应该绘制所有在那里的孩子,关闭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

回答:

通过限制所有ids被选中,可以在几个小时的工作后得到修复。我最终没有删除任何东西,只好重组了很多代码。对于那些试图找出他们加入的奇怪ID的人,绝对要限制你选择的东西。

回答:

Array#delete删除了等于你给它的参数中的任何物体。

对于活动记录对象,相等被定义为具有相同的ID。

你正在做select *但是活动记录没有看到table1.idtable2.id等 - 列影对方,所以当你太coor.id你会得到结果集中的ID列之一。

鉴于这是什么定义平等,这显然是一件坏事 - 例如说活动记录任意挑选b.id是其ID,那么当你从你会删除所有行上b.id有数组中删除该行那个价值。我猜你一直在玩你选择的东西,除非你选择了一些让每个对象都有不同ID的东西Array#delete不会玩球

另外,你真的不应该修改集合,而你是迭代它。

以上是 find_by_sql或数组问题 的全部内容, 来源链接: utcz.com/qa/263781.html

回到顶部