1

Railsアプリケーションに次のシナリオがあるとしましょう。

UsersがたくさんWebsitesあり、たくさんありWebsitesますSimulations(同様に、にWebsites属しUsers、にSimulations属しWebsitesます)。

問題は、ユーザーのすべてのシミュレーションのリストを[ユーザー表示]ページに表示するにはどうすればよいですか?

私の最初の腸の試みは、Users Controller:で以下を定義することでした。

def show
  @user = User.find(params[:id])
  @websites = @user.websites
  @simulations = @user.websites.simulations
end

そして、で使用<%= render @simulations %>しますが、 localhost:3000にアクセスすると、[]:Array`の: simulationsUsers Show Pageが得られます。NoMethodErrorundefined method

では、特定のに属するUser Controllerすべてのものを保持する変数を自分で作成するにはどうすればよいですか?SimulationsWebsitesUser

ありとあらゆる助けに大いに感謝します!

4

3 に答える 3

2
class User < ActiveRecord::Base
  has_many :websites
  has_many :simulations, :through => :websites
end

@simulations = @user.simulationsこれで、すべてのユーザーのシミュレーションを使用して取得できます

于 2012-08-07T06:59:05.730 に答える
0

エレズの答えを使う


あなたはそれを求めました-私はルビーについて知りませんが、@websitesの各ウェブサイトはすでにシミュレーションを持っているフィールドを含んでいるはずです。

これがあなたがしていることです。

1-ユーザー、単一のオブジェクトを取得し、そのWebサイトを取得します。涼しい。ユーザーは次のようになります(擬似コード):

 Object @user
    {
         Array[] websites = [(Website)site1, (Website)site2];
    } 

さて、それはクールです。したがってuser.websites、一連のWebサイトを返す必要があります。

2-あなたはウェブサイトからシミュレーションを取得しようとします。Webサイトはおそらく次のようになります。

 Object @website
    {
         Array[] simulations = [(Simulation)sim1, (Simulation)sim2];
    } 

うーん、どうして動かないの?さて、あなたがしていることを分解しましょう:

@user.websites.simulations

配列である、を取得し、型ではなく型websitesに属する変数を参照しようとしています。 Webサイト自体ではなく、Webサイトを保持する配列オブジェクトです。あなたが欲しいのは、ではなく、を取得することです。websitearray@user.websites@website.simulationswebsites.simulations

したがって、最初のステップはWebサイトを取得することです。これは簡単です。1つの方法は、ユーザーのWebサイト配列からWebサイトをフェッチすることです。

@User.websites[0] <-- may not be syntactically correct; I don't know ruby.

ここで、すべてのWebサイトを取得する場合は、ループを使用してWebサイトを反復処理し、新しい配列にプッシュします。再び擬似コードで:

@all_simulations = new Array();
for(@i=0;@i<count(@user.websites);@i++) //first loop through the websites
{
     for(@q=0;@q<count(@user.websites[@i].simulations);@q++) //then loop through the simulations
     {
           @all_simulations.push(@user.websites[@i].simulations[@q]); //push the simulation into @all_websites
     }
}

ここで行うことは、user.websites配列内の各Webサイトにアクセスし、そのWebサイトから各シミュレーションを取得して、それを@all_simulations変数にスローすることです。概念を理解すれば、このロジックを有効なルビーに変換できるはずです。

于 2012-08-07T02:20:49.997 に答える
0

ユーザーモデルにこのメソッドを追加します。これにより2つのクエリが生成されますが、ルビーコードでシミュレーションを結合するよりも優れています。

def websites_simulations
  Simulation.where(website_id: website_ids)
end
于 2012-08-07T06:49:25.833 に答える