【问题标题】:Best MVC approach when passing objects to a view from a controller? (Rails)将对象从控制器传递到视图时的最佳 MVC 方法? (导轨)
【发布时间】:2012-07-30 02:07:02
【问题描述】:

我有三个表:用户、任务和用户任务(其中用户和任务作为外键,没有其他列)。 UserTask 表中的条目可能存在也可能不存在,用于特定的用户/任务组合(出于可伸缩性原因,根据需要创建 UserTask 记录)。

在我看来,我想显示当前登录用户的所有任务。对于每个任务,如果 UserTask 表中存在相应的记录,我想显示文本“是”;否则我想显示“否”。但是我有点不确定我应该从控制器传递哪些对象到视图,以及一旦它们传递到视图我应该如何与对象交互(即我可以做什么)。

我应该将用户、任务和用户任务作为单独的变量从控制器传递到视图吗?这样,我可以通过简单地遍历 Tasks 变量来显示所有任务,并且对于每个任务,我可以在视图中使用where(ActiveRecord 查询)来确定每个任务是否有一个 UserTask。问题是,可以对传递到视图的对象进行wherefind 查询吗?我一直认为你把它留给控制器,只在视图中做简单的事情,比如迭代传递给视图的对象(如果有错,请纠正我)。

或者我应该在控制器中构建一个哈希,其中每个键都是一个任务,每个值都是一个用户任务,然后将该哈希传递给视图?这样,我可以通过简单地遍历所有键来显示视图中的所有任务,并且对于每个任务键,我可以通过检查值是否为空来显示“是”或“否”。

或者还有其他方式(即加入表格或其他方式......不确定如何工作)?

【问题讨论】:

  • 其实,如果你遵循Model2 MVC或HMVC,视图应该是从模型层获取信息。话又说回来..如果你真的严格遵守 MVC 模式,你也不会使用活动记录(反)模式。

标签: ruby-on-rails ruby rails-activerecord


【解决方案1】:

首先,您应该认真阅读 Rails 中的关联:

http://guides.rubyonrails.org/association_basics.html

您打算在用户和任务之间建立关系的方式让我觉得有点奇怪,但抛开这一点,按照您的描述实现它,您将在 UserTask 上定义关联和UserTask 模特:

class User < ActiveRecord::Base
  has_many :user_tasks
end

class Task < ActiveRecord::Base
  has_one :user_task
end

class UserTask < ActiveRecord::Base
  belongs_to :user
  belongs_to :task
end

在您的控制器中:

@user = User.includes(:user_tasks).find(...)
@tasks = Task.all

那么,在你看来(在 haml 中):

-@tasks.each do |task|
  =(@user.user_tasks.include?(task)) ? "yes" : "no"

编辑:根据 cmets 中的说明进行更新。

【讨论】:

  • 在我的场景中,任务不属于用户,并且用户没有很多任务。在这种情况下它会如何工作?
  • 我不明白你为什么要那样做。如果您想获取与用户关联的任务,那么您应该在两个模型之间建立关联。你是什​​么意思,用户没有“很多”任务?
  • 哦,我想我明白了。所以你的意思是你想遍历所有个任务,如果一个任务通过UserTask与@user相关联,则显示“是”,否则显示“否”?
猜你喜欢
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多