Rails 3.1 добавление объекта в массив, возвращаемый find_by_sql / не может быть показано в файле erb - PullRequest
0 голосов
/ 30 сентября 2011

Я портирую php-приложение на rails, поэтому у меня есть набор SQL-операторов, которые я конвертирую в find_by_sql.Я вижу, что он возвращает коллекцию объектов того типа, который я вызывал для него.Что я хотел бы сделать, это перебрать эту коллекцию (предположительно, массив) и добавить экземпляр определенного объекта, например:

#class is GlobalList
#sql is simplified - really joining across 3 tables
def self.common_items user_ids
    items=find_by_sql(["select gl.global_id, count(gl.global_id) as global_count from main_table gl group by global_id"])

    #each of these items is a GlobalList and want to add a location to the Array            
    items.each_with_index do |value,index|
        tmp_item=Location.find_by_global_id(value['global_id'])
        #not sure if this is possible
        items[index]['location']=tmp_item
    end
    return items
end

controller

#controller  
@common_items=GlobalList.common_items user_ids

view

#view code - the third line doesn't work
<% @common_items.each_with_index do |value,key| %>
        <%=debug(value.location) %> <!-- works -->
        global_id:<%=value.location.global_id %> <!-- ### doesn't work but this is an attribute of this object-->
<% end %>

Итак, у меня есть 3 вопроса:
1. Является ли элементы массивом?Он говорит, что это через вызов .class, но не уверен
2. Я могу добавить местоположение этих элементов GlobalList.Однако в коде представления я не могу получить доступ к атрибутам местоположения.Как мне получить к этому доступ?
3. Я знаю, что это довольно уродливо - есть ли лучший шаблон для реализации этого?

1 Ответ

0 голосов
/ 30 сентября 2011

Я хотел бы получить любые данные, которые вам нужны, из местоположений в запросе sql, чтобы избежать проблемы n + 1

   @items=find_by_sql(["select locations.foo       as location_foo, 
                               gl.global_id        as global_id, 
                               count(gl.global_id) as global_count 
                        from main_table gl 
                        inner join locations on locations.global_id = gl.global_id 
                        group by global_id"])

Тогда в представлении:

<code>
<% @items.each do |gl| %>
        <%= gl.location_foo %> <-- select any fields you want in controller -->
        <%= gl.global_count %>
        <%= gl.global_id %>
<% end %>

Если вы хотите, чтобы он был близок к тому, как есть, я бы:


def self.common_items user_ids
    items=find_by_sql(["select gl.global_id, count(gl.global_id) as global_count 
                        from main_table gl group by global_id"])

    items.map do |value|
        [value, Location.find_by_global_id(value.global_id)]
    end
end

Тогда в представлении:

<% @common_items.each do |value,location| %>
        <%=debug(location) %> 
        global_id:<%=value.global_id %> 
<% end %>
...