1

假设我们在 Rails 应用程序中有以下场景:

Users有很多WebsitesWebsites有很多Simulations(同样,Websites属于UsersSimulations属于Websites)。

现在的问题是,如何在“用户显示”页面上显示所有用户模拟的列表?

我的第一个直觉尝试是在以下内容中定义Users Controller

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

然后<%= render @simulations %>在 中使用Users Show Page,但是当我访问 localhost:3000 时,会为 []:Array`提供NoMethodError:模拟。undefined method

那么如何在我的变量中创建一个变量User Controller来保存所有Simulations属于Websites特定的变量User

非常感谢任何和所有帮助!

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

使用埃雷兹的答案


您要求的 - 我不了解 ruby​​,但@websites 中的每个网站都应该已经包含一个具有模拟的字段。

这就是你正在做的事情。

1 - 您获取用户、单个对象并获取其网站。凉爽的。用户看起来像这样(在伪代码中):

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

好吧,这很酷。所以user.websites应该返回一系列网站。

2 - 您尝试从网站获取模拟。一个网站大概是这样的:

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

嗯,怎么没效果?好吧,让我们分解一下你在做什么:

@user.websites.simulations

您正在使用websites,它是一个数组,并试图引用一个属于website类型而不是array类型的变量。 @user.websites是一个包含网站的数组对象,而不是网站本身。你想要的是得到@website.simulations,而不是websites.simulations

所以第一步是建立一个网站。这很容易 - 一种方法是尝试从用户的网站数组中获取网站。

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

现在,如果您想获取所有网站,请使用循环遍历它们并将它们推送到新数组。再次在伪代码中:

@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数组中的每个网站,然后从该网站获取每个模拟并将其放入我们的@all_simulations变量中。如果您理解这个概念,您应该能够将此逻辑转换为有效的 ruby​​。

于 2012-08-07T02:20:49.997 回答
0

在您的用户模型中添加此方法。这将产生 2 个查询,但仍然比在 ruby​​ 代码中加入模拟要好。

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