2014-12-19 26 views
1

我有我想象的是一个非常简单的问题,但我还没有能够找到答案后相当多的谷歌搜索。获取模型ID在哪里(价值== x)

说我有一个用户,每个user has_one 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) 
@[email protected] 

我有点不好意思问这东西简单,但我实在找不到一个直接的答案。提前谢谢了。

回答

3

Widget.where(:user_id => current_user.id)返回属于用户的所有小部件的集合 - 它不考虑在模型上定义的has_one关联,因为DB可能出于某种原因包含其他记录。

您需要的是第一个匹配记录 - Widget.where(:user_id => current_user.id).first。或者只需current_user.widget即可使用该关联。

1

你是轻微的正确,但认为这是这样的:

@id = Widget.where(user_id: current_user.id).first.try(:id) 

所以,你必须选择一个部件指定user_id,然后选择第一个值(如果有的话),并返回idnil

1

在查询总是给人阵列

@widget=Widget.where(:user_id => current_user).first 
@widget.id 
2

如果你只是一个当前用户的插件,你可以使用以下命令:

@widget = current_user.widget 

这将使用您定义的has_one关系。

对于不同的用户:

@widget = some_other_user.widget 

可以使用的情况下,正常的ActiveRecord的方法,你有突出部分的USER_ID。在这种情况下,你可以保存获取用户查询:

@widget = Widget.where(user_id: some_user_id).first 

在所有你要小心的情况下,因为在这两种情况下@widget可以nil没事的时候在数据库中找到。

+0

为什么针对不同的用户有不同的查询,而不仅仅是'some_other_user.widget'? – Surya 2014-12-19 10:57:13

+0

是真的!不知道我在想什么......可能只是想展示一种不同的查询方式......更新 – Fer 2014-12-19 11:01:14

1

您可以直接使用用户和widget之间的关联找到控件ID,像这样:

current_user.widget.try(:id) 

试所需的零值,如果当前用户没有任何插件,然后current_user.widget将返回零。

+0

我只是做了一件坏事。我upvoted大家=) – 2014-12-19 12:49:02