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.id
,table2.id
等 - 列影对方,所以当你太coor.id
你会得到结果集中的ID列之一。
鉴于这是什么定义平等,这显然是一件坏事 - 例如说活动记录任意挑选b.id
是其ID,那么当你从你会删除所有行上b.id
有数组中删除该行那个价值。我猜你一直在玩你选择的东西,除非你选择了一些让每个对象都有不同ID的东西Array#delete
不会玩球
另外,你真的不应该修改集合,而你是迭代它。
以上是 find_by_sql或数组问题 的全部内容, 来源链接: utcz.com/qa/263781.html