Ruby on rails Rails活动记录查询
我将如何进行这样的查询。 我有 现在我想过滤另一个模型,它与上面的模型关联。 帮我找到正确的方法Ruby on rails Rails活动记录查询,ruby-on-rails,ruby,sqlite,Ruby On Rails,Ruby,Sqlite,我将如何进行这样的查询。 我有 现在我想过滤另一个模型,它与上面的模型关联。 帮我找到正确的方法 model2 = Model2.where("model_id == :one_of_the_models_filtered_above", {:one_of_the_models_filtered_above => only_from_the_models_filtered_above}) model.rb是这样的 has_many :model2s model2.rb belongs_
model2 = Model2.where("model_id == :one_of_the_models_filtered_above", {:one_of_the_models_filtered_above => only_from_the_models_filtered_above})
model.rb是这样的
has_many :model2s
model2.rb
belongs_to :model
现在在@model=model.near[纬度,经度]6.8之后是这样的
model2s =[]
models.each do |model|
model.model2s.each do |model2|
model2.push(model2)
end
end
我想完成同样的事情,但要使用活动记录查询
我想我找到了什么,为什么失败了
Model2.where("model.distance_from([:latitude,:longitude]) < :dist", {:latitude => latitude, :longitude => longitude, :dist => 6.8})
此查询引发此错误
SQLite3::SQLException: near "(": syntax error: SELECT "tags".* FROM "tags" WHERE (model.distance_from([43.45101666666667,-80.49773333333333]) < 6.8)
,为什么使用包含。它将只加载两个SQL查询,而不是N+1
@models = Model.near( [latitude, longitude], 6.8 ).includes( :model2s )
因此,当您执行@models.first.model2s时,关联的model2s将已加载。有关更多信息,请参阅
如果要获取属于模型集合的所有Model2的数组,可以执行以下操作:
@models.collect( &:model2s )
# add .flatten at the end of the chain if you want a one level deep array
# add .uniq at the end of the chain if you don't want duplicates
collect(也称为map)将在数组中收集传递给每个调用方元素的任何块的结果。这与您的代码完全相同,有关更多信息,请参阅。符号前的&before将其转换为传递给集合中每个元素的过程,因此这与写入相同
@models.collect {|model| model.model2s }
还有一件事:@mu是对的,似乎SQLite不知道您和存储过程的距离。由于我怀疑这是一个与GIS相关的问题,您可以在上询问此特定问题,对于初始位,您可以使用IN子句吗?就像Model2.wheremodel_id in?,@models。在第二部分中,您是否尝试将数组传递给距离_?您是否可以在模型中拥有一个属性,该属性包含可以在查询中使用的值,而不是调用distance_from方法?您必须在SQLite的SQL风格中实现distance_from,或者添加一个用户定义的函数来实现它。您可以使用联接来选择在模型查询中具有匹配项的所有Model2对象
@models.collect {|model| model.model2s }