Ruby on rails 不确定我的用户/位置是否与Rails 4关联

Ruby on rails 不确定我的用户/位置是否与Rails 4关联,ruby-on-rails,has-many,belongs-to,model-associations,ruby-on-rails-4,Ruby On Rails,Has Many,Belongs To,Model Associations,Ruby On Rails 4,我创建了一个用户模型、一个位置模型和一个产品模型,但每次都有一个问题,当我玩控制台时,我对其中的一些结果感到惊讶 模型 类用户

我创建了一个用户模型、一个位置模型和一个产品模型,但每次都有一个问题,当我玩控制台时,我对其中的一些结果感到惊讶

模型

类用户 类CreateUsers 类UsersController User.createname:Wahou,电子邮件:wahou@bim.com,密码:motdepasse,密码\确认:motdepasse 是什么让我:

0.2ms开始事务 用户存在0.4ms从LOWERusers.email=LOWER'的用户中选择1作为一个wahou@bim.com“限制1 在“密码摘要”列上为“字符串”类型插入的二进制数据SQL 1.1ms插入到用户中创建的地址、电子邮件、名称、密码摘要、记住令牌、更新的地址值?、?、?、?、?、?、?[[创建时间:2013年5月24日星期五12:27:38 UTC+00:00],[电子邮件,wahou@bim.com],[name,Wahou],[password_digest,$2a$10$OhJ7SLA.vxO4N8IkZAXXQOibYQoX6G6E9/mGgmDpm8Hj48p8riDE.],[Memory_token,-O72ULpG2tjrZSSi0BFB5A],[2013年5月24日星期五12:27:38 UTC+00:00更新] 148.6ms提交事务 => 然后我键入:

地址:巴黎普里斯特街1号 这给了我:

0.2ms开始事务 SQL 6.0ms插入位置地址、创建位置、更新位置值?、?、?[[地址,巴黎普里斯特街1号],[创建时间:2013年5月24日星期五12:27:22 UTC+00:00],[更新时间:2013年5月24日星期五12:27:22 UTC+00:00]] 121.6ms提交事务 => 因此,我满怀信心地这样做:

User.first.location=location.first 这给了我:

用户加载0.5ms选择用户。*从用户按用户排序。id ASC限制1 位置负载0.4ms选择位置。*从位置按位置排序。id ASC限制1 => 当我输入User.first.location时,它给我零

所以我想我忘在什么地方了。你有什么想法吗

如果你用产品代替用户,它也会做同样的事情

编辑

我试图只键入User.first.location_id=1,而User.first.location始终为零

我发现定义用户位置的唯一方法是使用location创建他,就像这样:location.first.users.createname:Wahou,email:wahou@bim.com,密码:motdepasse,密码确认:motdepasse。然后,它起作用了。。。但是,当我想更新用户的位置时,我能做什么

编辑2

我打字的时候

u=用户优先 我看到第一个用户被抓获:

用户加载0.4ms选择用户。*从用户按用户排序。id ASC限制1 => 然后我影响位置。首先影响第一个用户的位置:

u、 location=location.first 我看到第一个位置被抓获:

位置载荷0 .4ms选择位置。*从位置按位置排序。id ASC限制1 => 但是当我想保存它的时候

u、 拯救 …它不起作用

0.1ms开始事务 用户存在0.4ms从LOWERusers.email=LOWER'的用户中选择1作为一个numero1@person.com'和users.id!=2限制1 0.2ms回滚事务 =>错误 编辑3

如果我尝试键入以下代码

User.first.update_属性位置:Location.first 它让我回想起:

用户加载0.4ms选择用户。*从用户按用户排序。id ASC限制1 位置负载0.3ms选择位置。*从位置按位置排序。id ASC限制1 0.1ms开始事务 用户存在0.4ms从LOWERusers.email=LOWER'的用户中选择1作为一个numero1@person.com'和users.id!=2限制1 0.2ms回滚事务 =>错误 解决

我真丢脸!我忘记在更新属性中添加密码和密码确认。如果我这样做,它会起作用

以下是正确的代码:

User.first.update_attributespassword:password,password_确认:password,location:location.first
是的,你忘了保存更改

u = User.first # => <User id: 1, name: "Wahou"....
l = Location.first #=> <Location id: 1, address: "1 rue.....

# set the location
u.location = l

#Save changes
u.save

#profit
User.first.location

@奥雷尔给了你正确的暗示。解释如下:

执行

User.first.location_id = 1
将第一个用户加载到临时对象中,然后设置位置id,然后将其丢弃而不保存。这就是为什么你的改变不是持久的

@奥雷尔氏

u= User.first
u.location = Location.first 
u.save
将第一个用户加载到u中,设置u的位置,然后将其保存以使其持久化。之后

User.first.location
首先给出对象的位置

另一种方法是用户更新_attribute,它设置一个属性并保存更改,因此

User.first.update_attribute :location, Location.first

同样有效并使更改持久。

谢谢你,马丁,最后一行有效。但我不明白为什么,因为当我使用User.first.update_attributeslocation:Location.first时,它不起作用。但如果我在一个全新的rails应用程序中这样做,只使用模型,没有控制器或视图,User.first.update_attributeslocation:Location.first就可以工作了。这有点奇怪。记录在案,@Aurel的方法根本不起作用……update_属性需要两个参数:属性名和值。funclocation:Location.first使用一个散列参数调用func:{Location:Location.first}。我想我找到了一些东西。update_属性方法之所以有效,是因为它不关心验证和质量分配。如果更新属性不起作用,这意味着我的验证或批量分配保护有问题,不是吗?我在你的模型中没有看到任何验证。。。但是批量分配保护只影响User.newattributes\u hash或u.update\u attributes\u hash、单个分配u.location=l或u.update\u属性不在批量分配保护范围内。事实上,我有一些验证,但我没有在这里写下来,因为我担心代码太多。。。我现在要加上它。