在rails app中的视图中显示多个模型结果

时间:2014-09-23 19:39:04

标签: ruby-on-rails

我正在为我的方案添加一个新模型,我想知道是否有办法将两个模型关联到一个模型中,然后在视图中显示任何/所有结果。例如,这是我目前拥有的;

@tweet_category.order("position").each do |tweet|
    <%= tweet.title %>
end

只是一个简短的例子......现在如果我将facebook添加到此中该怎么办?我首先考虑创建一个名为stuff的模型,然后将其与tweet_categoryfacebook_category相关联;

class Stuff < ActiveRecord::Base
    attr_accessible :title

    belongs_to :user
    has_many :tweet_category
    has_many :facebook_category
end

现在在我的控制器中,我猜我会做以下事情;

class StuffController < ApplicationController

    def index
       @stuff_list = Stuff.find(:all)
    end
end

在我看来,我只是从上面的视图中执行以下操作;

@stuff_list.order("position").each do |stuff|
    <%= stuff.title %>
end
我理解这里的逻辑吗?那将有两个模型/两个表db ..等..

1 个答案:

答案 0 :(得分:0)

首先,我不明白为什么你需要那个“东西”模型。它属于用户和has_many tweet_category和facebook_category,只是提供“标题”,当你的用户模型可以完成这项工作时(我的意思是,每个用户可以有很多推文和fb类别,而不是有一个或几个) “有很多东西的东西。”

无论如何,如果您想在模型之间建立链接,然后在视图中显示所有内容,请首先在用户模型中进行操作:

class User < ActiveRecord::Base
...
  has_many :facebook_categories #( I don't know how rails would pluralize it, btw, I'm just making an assumption )
  has_many :tweeter_categories
end

class Facebook_category
  ...
  belongs_to :user
end

并按照高音扬声器类别进行操作

然后在你的控制器中:

def show_everything #Here it's a custom action, but you can call it wherever you want
  @users = User.all
end

最后在你看来:

<% @users.each do |user| %>
    <% user.facebook_categories.all.each do |fb_c| %>
        <%= fb_c.title %>
    <% end %>

    <% user.tweeter_categories.all.each do |t_c| %>
        <%= t_c.title %>
    <% end %>
<% end %>

也许只是尝试为你的模型获取一个更好的名称,所以复数化不会变得混乱(我看到“.all”方法已被弃用,所以可能用某些东西替换它

希望它有所帮助!

修改:

基本上,当你做

@users = User.all

rails正在做的是将每个“用户”的每个哈希定义在一个数组中。所以,如果你想在一个数组中混合两个表的数组,你可以这样做:

@categories = [] << Facebook_category.all, Tweeter_category.all

然后您将拥有一个数组(@category),其中包含2个数组(Facebook_category有一个ActiveRecord关系,Tweeter_category有一个)。他们自己充满了他们模型的哈希。所以,你需要做的是:

@categories.flatten!

以下是flatten所做的API(基本上删除了第一个tarray中的所有嵌套数组)

现在,你得到了一个哈希数组,是你模型实例的信息。而且,如果可以订购这些信息,则在您的视图中,您只需:

<% @categories.order("updated_at").each do |i| %>
   <%= i.title %>
<% end %>