从逻辑中获取逻辑...帮助named_scope

时间:2010-11-19 02:26:58

标签: ruby-on-rails ruby named-scope

我创建了一个应用程序,我允许用户记录他们的锻炼。

用户可以保留其锻炼的私人或公共日志,并由check_box字段表示,该字段将整数1传递给workout.share列。可以通过workouts_controller查看私有日志,我通过过滤current_user来限制所有输出。

workouts_controller.rb

@workouts = current_user.Workouts.all

公共训练通过一个单独的community_controller显示,我在那里调用这样的训练

community_controller

@workouts = Workouts.all

然后使用以下

过滤视图中的结果
<% @workouts.each do |workout| %>
 <% if workout.share == 1 %> 
  ...
 <% end %>
<% end %>

最好我可以说这不是首选的方法,我怀疑我想要一个named_scope,这样我就可以创建一个新的变量`@shared_workouts'。那说我不熟悉命名范围所以可以使用一些帮助来放置什么和正确的语法。

2 个答案:

答案 0 :(得分:1)

如果您使用的是rails 2,请使用以下命令:

class Workout < ActiveRecord::Base
  named_scope :shared, :conditions => {:share => 1}
end

如果您使用的是rails 3,请改用:

class Workout < ActiveRecord::Base
  scope :shared, where(:share => 1)
end

然后在社区控制器中,您只需使用@workouts = Workouts.shared.all

即可

答案 1 :(得分:1)

正如Peter上面提到的,根据您使用的Rails版本使用named_scope / scope。此外,您不希望使用值1进行测试。您想使用true(即如果您在迁移中使用了类型boolean)。

原因是如果您更改数据库,它可能会以不同的方式存储(例如,SQLite有一个布尔类型,mySQL使用一个小的int ...),并且活动记录将为您管理它。 :)

class Workout < ActiveRecord::Base
  named_scope :shared, :conditions => {:share => true}
end

class Workout < ActiveRecord::Base
  scope :shared, where(:share => true)
end

然后使用“Workouts.shared”访问named_scope。