我有我想象的是一个非常简单的问题但是在谷歌搜索后我找不到答案。
假设我有一个用户和每个user has_one widget
。现在,widget表设置如下:
mysql> show columns in widgets;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| user_id | int(11) | YES | MUL | NULL | |
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
+------------+--------------+------+-----+---------+----------------+
我想使用user_id查找小部件的id,并将其作为@id存储在我的控制器中。
我尝试了以下几种变体而没有成功:
@widget=Widget.where(:user_id => current_user)
@id=@widget.id
我觉得很尴尬,问这个简单的东西,但我真的找不到直接的答案。非常感谢提前。
答案 0 :(得分:3)
Widget.where(:user_id => current_user.id)
返回属于用户的所有小部件的集合 - 它不会考虑模型上定义的has_one
关联,因为DB可能因某种原因包含其他记录。
您需要的是第一个匹配记录 - Widget.where(:user_id => current_user.id).first
。或者只是current_user.widget
,以使用关联。
答案 1 :(得分:2)
如果您只是当前用户的小部件之一,则可以使用以下内容:
@widget = current_user.widget
这将使用您定义的has_one
关系。
对于其他用户:
@widget = some_other_user.widget
如果您拥有user_id,则可以使用常规的ActiveRecord方法。在这种情况下,您只需保存获取用户的查询:
@widget = Widget.where(user_id: some_user_id).first
在所有情况下,您都必须小心,因为在这两种情况下,@widget
在数据库中找不到任何内容时可以nil
。
答案 2 :(得分:1)
你是略微正确的,但认为这是方式:
@id = Widget.where(user_id: current_user.id).first.try(:id)
所以你必须为指定的user_id
选择一个小部件,然后选择第一个值(如果有的话),然后返回id
或nil
。
答案 3 :(得分:1)
在哪里查询总是给出数组
@widget=Widget.where(:user_id => current_user).first
@widget.id
答案 4 :(得分:1)
您可以直接使用用户和窗口小部件之间的关联来查找窗口小部件ID,如下所示:
current_user.widget.try(:id)
如果当前用户没有任何小部件,那么尝试nal值是必需的,那么current_user.widget将返回nil。