Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 在Rails 4中,控制器应该如何通过非id字段获取参数来指定关联?_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 4 在Rails 4中,控制器应该如何通过非id字段获取参数来指定关联?

Ruby on rails 4 在Rails 4中,控制器应该如何通过非id字段获取参数来指定关联?,ruby-on-rails-4,Ruby On Rails 4,每个小部件都有一个关联的用户。用户有一个名为email的字符串属性,该属性存储与用户关联的电子邮件地址 根据Rails惯例,用户模型具有唯一的id属性,但也确保email地址是唯一的。因此,User.where(电子邮件:foo@example.com)保证最多返回一个结果 在创建小部件的表单中,我希望用户能够指定电子邮件地址,而不是ID。ID和email都是用户的唯一键,但电子邮件地址对人们来说更方便 小部件控制器接受关联引用的建议方式是什么,该引用通过非id的键命名关联?使用id时,如果wi

每个小部件都有一个关联的用户。用户有一个名为
email
的字符串属性,该属性存储与用户关联的电子邮件地址

根据Rails惯例,用户模型具有唯一的
id
属性,但也确保
email
地址是唯一的。因此,
User.where(电子邮件:foo@example.com)
保证最多返回一个结果

在创建小部件的表单中,我希望用户能够指定电子邮件地址,而不是ID。
ID
email
都是用户的唯一键,但电子邮件地址对人们来说更方便

小部件控制器接受关联引用的建议方式是什么,该引用通过非
id
的键命名关联?使用
id
时,如果
widget[user\u id]
参数存储用户的id,则批量分配(在
create
update
中)会将正确的用户存储在widget中。是否有任何内置Rails支持使类似
widget[user\u email]
的东西工作,或者我应该在控制器中添加代码来识别该参数、查找用户并将用户与小部件关联

代码如下:

class Widget < ActiveRecord::Base
  has_one :user
end

class User < ActiveRecord::Base
end

class WidgetsController
  load_and_authorize_resource

  def create
    @widget.save
  end

  def widget_params
    params.require(:widget).permit(...)
  end
end
class小部件
我考虑过:

  • 修改小部件模型以添加“用户电子邮件”的setter,在那里查找用户,并适当地设置“用户id”
  • 修改WidgetsController#widget_参数以注意到“widget[user_email]”的存在,查找用户,并将其替换为“widget[user_id]”
我倾向于第二种选择


有更好的办法吗?

我在理解这一点上有点困难。如果想让它与rails一起使用,需要通过ID保持关联。当你说has_many,belown_to,has_one时,Rails是基于id字段在幕后处理关系的。如果您希望用户关联电子邮件地址,您仍然可以传入该电子邮件地址,然后您可以通过电子邮件地址找到该用户,并使用ID将该记录关联到小部件。这有意义吗?@fatfrog,感谢您查看此问题。我已经做了编辑来澄清意图。你的最后一句话就是我要说的。我了解在幕后使用ID字段;我只是希望Rails可以内置一些东西来处理通过备用键进行的查找。您可以像这样更改关系中的外键:has_many:submissions,class_name:“Employee”,foreign_key:“manager_id”-