最小化视图中的实例变量

时间:2014-04-28 01:58:59

标签: ruby-on-rails

我正在寻找针对Rails设计问题的头脑风暴投入。

我有简单的书评功能。有Book类,User类和UserBook类(a.k.a。,评论和评级)。

class User < ActiveRecord::Base
   has_many :user_books
end

# (book_id, user_id, review data...)
class UserBook < ActiveRecord::Base
   belongs_to :user
   belongs_to :book
end

在&#34; show&#34;的相应书籍控制器中。预订行动,我需要加载书籍数据以及书评。我还需要找出当前用户(如果有的话)是否为这些评论做出了贡献。

我目前正在运行两个查询,Book.where(...)和UserBook.where(...),并将结果放入传递给视图的两个单独的对象中。现在,虽然我可以运行第三个查询来查找用户是否在这些评论中(在UserBook上),但我更愿意从@reviews结果集中提取。但我是在控制器中还是在视图中执行此操作?

另外值得注意的是,在视图中我必须相应地绘制Add vs Update审阅按钮及其相应的ajax URL。因此,在开始循环遍历结果集之前,我更愿意了解它。

如果我在控制器中检测到这个,我需要传入三个实例变量,我理解在Rails中被认为是令人反感的。不知道如何避免这种情况。

建议表示赞赏。

1 个答案:

答案 0 :(得分:0)

这有点像has_many的情况,它适用于你想通过中间表(在本例中为UserBook)访问第三个表的数据的情况

Great explanation of has_many :through here

可能看起来像这样:

class User < ActiveRecord::Base
  has_many :user_books
  has_many :users, through: :books
end

然后你可以简单地调用

@user = User.find(x)
@user.user_books` # (perhaps aliased as `User.find(x).reviews`)

@user.books

获取与用户相关联的所有图书的列表。

通过这种方式,您可以使用单个@user实例变量访问特定用户所需的所有信息。

PS - 您需要查看Eager loading的概念,这将阻止您在获取所有这些信息时进行无关的数据库调用。