我需要找到所有“俱乐部”,其中“userlist”列(包含一组用户ID)包含“current_user.id”。
以下是我试图用来实现此目的的控制器中的代码行:
@userclubs = Club.where('userlist in (?)', current_user.id).all
我最终得到一个空数组:[]
这是我在视图中使用的代码:
<%= f.association :clubs, :collection => @userclubs, :label_method => :name, :value_method => :name, :as => :check_boxes, :item_wrapper_class => 'inline' %>
如果我将控制器代码更改为@userclubs = Club.all
,我会将所有俱乐部作为复选框,但我只希望显示用户所属的俱乐部。
我可能认为这一切都错了,但我是RoR的新手,似乎找不到合适的方法。
答案 0 :(得分:0)
where
方法是SQL上的薄层。你的属性只是Rails眼中的一个数组。从数据库的角度来看,userlist
是一个文本字段,您只能将其作为文本字段进行搜索。
虽然搜索序列化结构通常不实用,如Searching serialized data, using active record中所述,在平面数组的情况下,您可以对列进行正则表达式搜索,查找有问题的user_id,注意确保user_id被适当的单独字符包围,如:
userlist rlike ...
其中...
是构造的正则表达式,包括?
,其中current_user.id
的值由相应的单独字符包围。
由于您正在使用Postgres,您可以将列数据类型更改为本机array
,但这只是一个微小的改进,如“搜索数组”中http://www.postgresql.org/docs/9.1/static/arrays.html中所述。 / p>
除非你有特殊情况,否则最好使用Rails关联机制存储这样的关系。