如何将不同变量的结果合并为一个变量?

时间:2012-05-16 06:30:33

标签: ruby-on-rails ruby ruby-on-rails-3 controller

我在控制器索引操作中有以下四个变量,它们从不同的模型中检索数据,如下所示:

@forum = Forum.where(:user_id => @users.collect(&:user_id)).all
@poll=Poll.where(:created_by => @users.collect(&:user_id)).all
@article = Article.where(:user_id => @users.collect(&:user_id)).all
@jobpost = Jobplacement.where(:user_id => @users.collect(&:user_id)).all

我想将所有这些变量的数据加入到单个变量@post中。我怎么能这样做?

4 个答案:

答案 0 :(得分:1)

在单个集合中使用不同类型的对象并不好。 但正如你问的尝试

@post = [@forum,@forum,@article,@jobpost].flatten

答案 1 :(得分:0)

这样的事情:

conditions = { :user_id => @users }  # assuming primary_key is set correctly
                                     # in the User model
@post = Forum.where( conditions ).all   +
        Poll.where( conditions ).all    +
        Article.where( conditions ).all +
        Jobplacement.where( conditions ).all

或者如果你想得到幻想:

models = [ Forum, Poll, Article, Jobplacement ]

@post  = models.reduce [] do |records, model|
  records.push *model.where( :user_id => @users ).all
end

注意: .all在两种情况下可能都是不必要的,因为它通常在必要时由Rails自动调用,但我不确定。

答案 2 :(得分:0)

将它们放入哈希:

@post = Hash.new
@post['forum']   = Forum.where(:user_id => @users.collect(&:user_id)).all
@post['poll']    = Poll.where(:created_by => @users.collect(&:user_id)).all
@post['article'] = Article.where(:user_id => @users.collect(&:user_id)).all
@post['job_placement'] = Jobplacement.where(:user_id => @users.collect(&:user_id)).all

它们不是加入,但它们只在一个变量中。您可以随时访问它们,并随意使用它们。

答案 3 :(得分:0)

我认为你需要像视图模型概念。在不继承ActiveRecord::Base的情况下创建一个简单的模型类,并将所有对象作为属性添加到新类中并初始化它。

class Post 
   attr_accessor :forum, :poll, :article, :jobpost
   def initialize(forum,poll,article,jobpost)
      @forum = forum
      @poll = poll
      @article = article
      @jobpost = jobpost
   end
end

在控制器操作中添加以下内容;

@post = Post.new(@forum,@poll,@article,@jobpost)