如何验证关联是否有效

its*_*lid 4 ruby activerecord ruby-on-rails

我有一个名为Profile的模型,它是belongs_to User,因此有一个'user_id'供数据库跟踪.在我为此模型制作的本地管理界面中,我想提供允许管理员在编辑屏幕中输入字段的用户名的灵活性,然后将其解析为user_id以保存在控制器中.

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

更新:我想要做的是验证表单中的用户名字段确实是真实用户,然后我可以将user_id保存回管理员正在编辑的配置文件.这里'return'表示返回的用户对象.

Sim*_*tti 5

此问题是虚拟属性的理想选择.而不是尝试解析用户名,让配置文件模型为您工作.

class Profile

  belongs_to :user

  # ...

  def username
    user.try(:username)
  end

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

end
Run Code Online (Sandbox Code Playgroud)

然后在你的表格

<% form_for @profile do |f| %>

  <%= f.text_field :username %>

<% end %>
Run Code Online (Sandbox Code Playgroud)

提交时,username字段的值将自动与所有其他真实的activerecord属性一起传递.ActiveRecord将查找username = setter并解析关联.如果关联返回nil(给定用户名不存在记录),则它将当前user_id设置为nil,验证将按预期失败.

您可能希望自定义错误代码以使其更有意义.

编辑:添加了示例.

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
Run Code Online (Sandbox Code Playgroud)