2011-12-30 8 views
0

Couchrest_modelをRails ORM to CouchDBとして使用しています。私は、Railsに2つの異なるCouchDBドキュメントからの情報の "結合"を行い、Railsに結合されたデータを自動取得させることはできません。2つの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に私は私の2つのモデルからのデータを持つテーブルを表示したい:

<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 %> 
ここ

は、二つの関連のモデルです

ベンダーモデルからベンダーの文字列を表示したい。セレクタヘルパーをビューに使用して、CouchDBを使用してモデル間で「結合」情報を表示しましたが、ビューテーブルに文字列を印刷するだけのシンプルなケースでは、どのように結合するかわかりません。

はここでかなり標準であるインデックスに対応パッケージコントローラです:

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は、ベンダ情報に引っ張っていませんその通りです...

+0

私が考えることができる最も単純な解決策は、これを行うことでした。​​<%= Vendor.get(package.vendor_id).vendor%>。私はこれが最良の "Railsの方法"であるかどうかはわかりませんが、それは機能します。他の誰かがより良い(つまりよりクリーンな)ソリューションを持っているなら、私は小切手でそれらを授与すること以上に満足しています! – Sly

答えて

0

私はあなたの質問を理解しているが、あなたのパックに接続されているベンダーのインスタンスからベンダーの文字列を取得したい年齢のインスタンス? @ package.vendor.vendorを使用するだけです。

すべてのパッケージを取得する際にベンダーレコードを含めることは簡単ではないので、1つのリクエストを行うだけです。 CouchDDはドキュメントのリンクや結合をサポートしていないため、すべてのパッケージを取得した後にベンダーをフェッチする必要があります。たとえば100個のパッケージがあり、付属のすべてのベンダーからベンダー文字列を取得したい場合は、典型的なn + 1の状況(100 + 1要求)になります。すべてのパッケージを取得する1つの要求と、各ベンダに100を要求します。よりよい解決策は、最初のリクエストの後にすべてのベンダのすべてのキーを取得し、フェッチ中に「キー」パラメータを使用して2番目のリクエストですべてのベンダをフェッチすることです。 (Documentation

私はあなたを助けてくれることを願っています。

+0

ありがとうマティアス! @ package.vendor.vendorが動作します。また、パッケージの数が増えるにつれてパフォーマンスペナルティの詳細な説明をお寄せいただきありがとうございます。私の場合、パッケージは一握り以上になることはないので、大きなペナルティは発生しません。 – Sly

関連する問題