Rails активная запись запроса - PullRequest
0 голосов
/ 04 ноября 2011

Как бы я сделать запрос, как это. у меня есть

@model = Model.near([latitude, longitude], 6.8)

Теперь я хочу отфильтровать другую модель, которая связана с приведенной выше. (помогите мне найти правильный способ сделать это)

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

модель2.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)

, почему

1 Ответ

0 голосов
/ 05 ноября 2011

используйте includes.Он будет загружать связанные модели (только два SQL-запроса вместо N + 1).

@models = Model.near( [latitude, longitude], 6.8 ).includes( :model2s )

, поэтому, когда вы выполните @models.first.model2s, связанные модели 2 уже будут загружены (см. Руководства RoR для получения дополнительной информации).

Если вы хотите получить массив всех 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) соберет вмассив результатов любого блока, переданного каждому из элементов вызывающей стороны (это точно так же, как ваш код, для получения дополнительной информации см. Документ Enumerable ).& перед символом преобразует его в Proc, переданный каждому элементу коллекции, так что это то же самое, что написать

@models.collect {|model| model.model2s }

еще одну вещь: @mu прав, кажется, SQLite делаетне знаю о вашей distance_from хранимой процедуре.Поскольку я подозреваю, что это вопрос, связанный с ГИС, вы можете задать этот конкретный вопрос на gis.stackexchange.com

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...