Ruby on rails 如何验证关联是否有效

Ruby on rails 如何验证关联是否有效,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我有一个名为Profile的模型,它属于用户,因此数据库需要跟踪“User\u id”。在我为这个模型制作的本地管理界面中,我想提供灵活性,允许管理员在编辑屏幕的一个字段中输入用户名,然后将其解析为用户id以保存在控制器中 然而问题是,我如何检查用户名是否有有效的返回?我发现在ActiveRecord::Validation中没有验证关联是否存在的方法。你将如何处理这种情况 更新:我想做的是验证表单中的用户名字段是否确实是真实用户,然后我可以将该用户id保存回管理员正在编辑的配置文件。此处“re

我有一个名为Profile的模型,它属于用户,因此数据库需要跟踪“User\u id”。在我为这个模型制作的本地管理界面中,我想提供灵活性,允许管理员在编辑屏幕的一个字段中输入用户名,然后将其解析为用户id以保存在控制器中

然而问题是,我如何检查用户名是否有有效的返回?我发现在ActiveRecord::Validation中没有验证关联是否存在的方法。你将如何处理这种情况


更新:我想做的是验证表单中的用户名字段是否确实是真实用户,然后我可以将该用户id保存回管理员正在编辑的配置文件。此处“return”表示返回的用户对象。

这是活动记录关联的有用参考:

要检查关联是否存在,只需检查association.nil


为了检查用户名是否有有效的返回,我不太清楚你的意思。你能详细说明一下吗?

这个问题很适合虚拟属性。 与其尝试解析用户名,不如让配置文件模型为您创建作业

class Profile

  belongs_to :user

  # ...

  def username
    user.try(:username)
  end

  def username=(value)
    self.user = User.find_by_username(value)
  end

end
然后以你的形式

<% form_for @profile do |f| %>

  <%= f.text_field :username %>

<% end %>

如果用户id是可选的,那又如何?这里的个人资料可能不属于任何人。有很多方法可以实现这一点。如果用户名不存在,您可能需要更改username=()以返回0,而不是nil。在这种情况下,您可以在保存时检查值是否为==0并使对象无效。验证:确保_username_exists def username=(value)self.user_id=user.find by_username(value)| | 0 end protected def确保_username_exists如果user_id==0#nil是允许的错误。add(:user_id,“username not exists”)返回false end end end这只是一种可能的解决方案。抱歉。我写了一个示例,但注释似乎不能包含代码:S@weppos您可以尝试将该示例放回答案。
username=
是否意味着我们重写rails/active record的默认属性帐户?将值检查为零被认为是一种不好的做法?。除非相反,否则请使用。因此,上面的示例是:除非@profile.user。。某物结束
<% form_for @profile do |f| %>

  <%= f.text_field :username %>

<% end %>
validate :ensure_username_exists 

def username=(value) 
  self.user_id = User.find_by_username(value) || 0 
end 

protected 

  def ensure_username_exists 
    if user_id == 0 # nil is allowed 
      errors.add(:user_id, "Username doesn't exists") 
      return false 
    end
  end