-1

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

@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

4 回答 4

2

在单个集合中拥有不同类型的对象是不好的。但正如你所要求的那样尝试

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

更新:当我还是 Ruby 的新手时,我写了这个答案。当我看到这个答案时,我无法控制自己的笑容。flatten 的目的是从嵌套数组中生成单个数组。答案与问题无关。但我对赞成票感到惊讶:)

于 2012-05-16T06:45:40.943 回答
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

它们没有加入,但它们在一个变量中。您可以随时访问它们,并随心所欲地使用它们。

于 2012-05-16T06:59:21.163 回答
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 自动调用,但我不确定。

于 2012-05-16T06:50:45.807 回答
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)
于 2015-04-26T03:52:08.737 回答