如何通过相关模型在表单中使用 collection_check_boxes?
How to use collection_check_boxes in a form, via a related model?
我的应用程序包含拥有播放列表的事件。一个用户属于一个或多个事件,因此该事件拥有的任何播放列表:
class User < ActiveRecord::Base
has_and_belongs_to_many :events
has_many :playlists
class Event < ActiveRecord::Base
has_and_belongs_to_many :users
has_many :playlists
class Playlist < ActiveRecord::Base
belongs_to :event
belongs_to :user
例如,如果 EventA 包含 PlaylistB 和 PlaylistC,则属于 EventA 的任何用户都可以看到这两个播放列表,无论播放列表是谁创建的。
(这里可能不相关,但是用户管理是通过Devise处理的,权限是通过CanCanCan管理的。)
关联在 rails 控制台中正常工作,例如,我可以看到用户可以访问的所有播放列表:
@user = User.first
@user.events.map(&:playlists)
我的问题是,如何在 form_for
表单上访问此用户的播放列表? 也就是说,我想为属于任何用户的任何播放列表添加复选框用户可以访问的事件。
此行从所有播放列表创建复选框:
= f.collection_check_boxes :playlist_ids, Playlist.all, :id, :name
但我看不出如何将复选框限制为该用户可访问的播放列表。我试过了:
= f.collection_check_boxes :playlist_ids, current_user.events.map(&:playlists), :id, :name
哪个returns:
undefined method `id' for
Playlist::ActiveRecord_Associations_CollectionProxy:0x007fca5c3f9368
我还没有尝试过这些代码,但我认为它会起作用
= f.collection_check_boxes :playlist_ids, Playlist.where("event_id IN (?)", current_user.event_ids), :id, :name
我的应用程序包含拥有播放列表的事件。一个用户属于一个或多个事件,因此该事件拥有的任何播放列表:
class User < ActiveRecord::Base
has_and_belongs_to_many :events
has_many :playlists
class Event < ActiveRecord::Base
has_and_belongs_to_many :users
has_many :playlists
class Playlist < ActiveRecord::Base
belongs_to :event
belongs_to :user
例如,如果 EventA 包含 PlaylistB 和 PlaylistC,则属于 EventA 的任何用户都可以看到这两个播放列表,无论播放列表是谁创建的。
(这里可能不相关,但是用户管理是通过Devise处理的,权限是通过CanCanCan管理的。)
关联在 rails 控制台中正常工作,例如,我可以看到用户可以访问的所有播放列表:
@user = User.first
@user.events.map(&:playlists)
我的问题是,如何在 form_for
表单上访问此用户的播放列表? 也就是说,我想为属于任何用户的任何播放列表添加复选框用户可以访问的事件。
此行从所有播放列表创建复选框:
= f.collection_check_boxes :playlist_ids, Playlist.all, :id, :name
但我看不出如何将复选框限制为该用户可访问的播放列表。我试过了:
= f.collection_check_boxes :playlist_ids, current_user.events.map(&:playlists), :id, :name
哪个returns:
undefined method `id' for Playlist::ActiveRecord_Associations_CollectionProxy:0x007fca5c3f9368
我还没有尝试过这些代码,但我认为它会起作用
= f.collection_check_boxes :playlist_ids, Playlist.where("event_id IN (?)", current_user.event_ids), :id, :name