复杂的SQL查询或控制器中的复杂处理?

时间:2012-06-27 10:03:14

标签: sql ruby-on-rails database

我正在使用Rails 3,并构建一个应用程序,用户可以在其中放置要租用的对象。对于每个对象,他可以决定:

  • 该对象可以由整个世界(可能)租用(对象访问受限制)
  • 该对象只能由我的朋友租用(在应用中,通过has_many friends, :through => friendship协会)
  • 该对象可以由以下组的成员租用(然后用户选择他所属的所有组或其中的一部分)

我的问题是如何显示current_user可以看到的对象列表?我看到两个选项,我想知道哪个是最好的选择,或者它们是否相同:

1)在对象控制器中,构建用户可以看到的对象集合(@ objects = Object.can_see(current_user)),然后将其传递给索引视图并显示整个列表

2)在控制器中,收集所有对象(@objects = Object.all),将其传递给索引视图,并在视图中,对于每个对象,进行一系列测试以确定是否应显示对象

1 个答案:

答案 0 :(得分:1)

最后,您可以根据项目所处的位置来决定。你真的有三个选择:

  1. 通过SQL语句处理整个查询。
  2. 通过SQL语句处理一些初始过滤,然后过滤返回的数据。
  3. 通过SQL语句返回所有数据,并过滤返回的数据。
  4. 请记住,SQL db是内置的,用于执行快速数据访问。如果您的解决方案没有任何初始过滤,我会非常惊讶,除非您返回非常小的数据集进行过滤。最后,它归结为您的逻辑是多么复杂(它可以用SQL表达并且仍然可以理解吗?),每个选项的性能如何,以及解决方案的可扩展性。

    还有许多优秀的ORM可以帮助模糊业务逻辑和数据访问之间的界限。他们中的许多人将根据您的代码动态创建复杂的SQL,因此对于它的丑陋程度并没有太大的担忧。