Объединение информации из двух моделей CouchDB в представлении Rails - PullRequest
0 голосов
/ 30 декабря 2011

Я использую Couchrest_model в качестве Rails ORM для CouchDB.Я хочу, чтобы Rails выполнял "соединение" информации из двух разных документов CouchDB для представления, но, похоже, не могу заставить Rails автоматически извлекать объединенные данные.

Вот две связанные модели:

class Package < CouchRest::Model::Base                                                                                                                                                                                                                                                                                                
  belongs_to :vendor                                                                                                                                                            

  property :shortcode, String                                                                                                                                                   
  property :pins, Integer                                                                                                                                                       

end

class Vendor < CouchRest::Model::Base                                                                                                                                           
  property :vendor, String                                                                                                                                                      
  timestamps!                                                                                                                                                                   
end                                                                                                                                                                             

Итак, теперь в моем index.html.erb для / packages я хочу отобразить таблицу с данными двух моих моделей:

<h1>Listing packages</h1>                                                                                                                                                       

<table>                                                                                                                                                                         
  <tr>                                                                                                                                                                          
    <th>Shortcode</th>                                                                                                                                                          
    <th>Pins</th>                                                                                                                                                                                                                                                                                                                   
    <th>Vendor</th>                                                                                                                                                             
    <th></th>                                                                                                                                                                   
  </tr>                                                                                                                                                                         

<% @packages.each do |package| %>                                                                                                                                               
  <tr>                                                                                                                                                                          
    <td><%= package.shortcode %></td>                                                                                                                                           
    <td><%= package.pins %></td>                                                                                                                                                                                                                                                                                     
    <td><%= package.vendor %></td>                                                                                                                                         
    <td><%= link_to 'Show', package %></td>                                                                                                                                     
    <td><%= link_to 'Edit', edit_package_path(package) %></td>                                                                                                                  
    <td><%= link_to 'Destroy', package, confirm: 'Are you sure?', method: :delete %></td>                                                                                       
  </tr>                                                                                                                                                                         
<% end %>                                                                                                                                                                       
</table>                                                                                                                                                                        

<br />                                                                                                                                                                          

<%= link_to 'New Package', new_package_path %>  

Я хочу отобразить поставщикаСтрока из модели Vendor.Я использовал помощник селектора в представлении для отображения «объединенной» информации по моделям с CouchDB, но я не могу понять, как присоединиться в этом, казалось бы, более простом случае простой печати строки в таблице представления.

Вот контроллер Package, который соответствует индексу, который является довольно стандартным:

class PackagesController < ApplicationController                                                                                                                                
  # GET /packages                                                                                                                                                               
  # GET /packages.json                                                                                                                                                          
  def index                                                                                                                                                                     
    @packages = Package.all                                                                                                                                                     

    respond_to do |format|                                                                                                                                                      
      format.html # index.html.erb                                                                                                                                              
      format.json { render json: @packages }                                                                                                                                    
    end                                                                                                                                                                         
  end          

Я пытался выполнить стандарт

@packages = Package.all(:include => :vendor)

, но Couchrest_model не тянет винформация о продавце таким образом ...

1 Ответ

0 голосов
/ 01 января 2012

Я не уверен, что понимаю ваш вопрос, но вы хотите получить строку поставщика из экземпляра Vendor, который прикреплен к вашему экземпляру пакета? Просто используйте @ package.vendor.vendor

Нет (простого) способа включить запись поставщика при получении всех пакетов, так что вам нужно всего лишь сделать 1 запрос. Вы должны получить поставщика после того, как вы выбрали все пакеты, потому что CouchDD не поддерживает связывание документов или присоединения. Если у вас есть, например, 100 пакетов и вы хотите получить строку поставщика от всех подключенных поставщиков, вы получите типичную ситуацию n + 1 (100 + 1 запросов). 1 запрос на получение всех пакетов и 100 для каждого поставщика. Лучшим решением является получение всех ключей всех поставщиков после первого запроса и выборка всех поставщиков во втором запросе с использованием параметра «keys» при получении. ( Документация )

Надеюсь, я смогу вам помочь.

...