Ruby on rails 从视图中获取逻辑…帮助命名\u范围

Ruby on rails 从视图中获取逻辑…帮助命名\u范围,ruby-on-rails,ruby,named-scope,Ruby On Rails,Ruby,Named Scope,我已经创建了一个应用程序,允许用户记录他们的训练 用户可以保留其训练的私人或公共日志,并由复选框字段表示,该字段将整数1传递到workout.share列。私人日志可通过训练\ U控制器查看,在该控制器中,我通过过滤当前\ U用户来限制所有输出 训练\u controller.rb @workouts = current_user.Workouts.all 公共训练通过一个单独的社区控制器显示,在那里我称之为这样的训练 社区控制员 @workouts = Workouts.all 然后使用以

我已经创建了一个应用程序,允许用户记录他们的训练

用户可以保留其训练的私人或公共日志,并由复选框字段表示,该字段将整数
1
传递到workout.share列。私人日志可通过训练\ U控制器查看,在该控制器中,我通过过滤当前\ U用户来限制所有输出

训练\u controller.rb

@workouts = current_user.Workouts.all
公共训练通过一个单独的社区控制器显示,在那里我称之为这样的训练

社区控制员

@workouts = Workouts.all
然后使用以下命令过滤视图中的结果

<% @workouts.each do |workout| %>
 <% if workout.share == 1 %> 
  ...
 <% end %>
<% end %>

...

我能说的最好的方法不是这样做,我怀疑我想要一个命名的范围,这样我就可以创建一个新变量“@shared\u workouts”。也就是说,我不熟悉命名的作用域,因此可以在放置内容和正确语法方面使用一些帮助

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

class Workout < ActiveRecord::Base
  named_scope :shared, :conditions => {:share => 1}
end
课堂训练{:共享=>1}
结束
如果您使用的是rails 3,请改用此选项:

class Workout < ActiveRecord::Base
  scope :shared, where(:share => 1)
end
课堂训练1)
结束

然后在community controller中,您可以简单地使用
@workouts=workouts.shared.all

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

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

课堂训练{:share=>true}
结束

课堂训练true)
结束
然后使用“Workouts.shared”访问指定的\u范围

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