【问题标题】:Rails joker has_one username, dancer has_one usernameRails 小丑 has_one 用户名,舞者 has_one 用户名
【发布时间】:2012-10-30 21:12:21
【问题描述】:

在我的 rails 应用程序中,我有一个用户名模型,它以多态方式附加到 2 个模型小丑和舞者。

创建 Joker 时,表单会发送一个字符串,该字符串是 Joker 的用户名。对于用户名,我应该如何进行设置,以便 rails 在接收字符串而不是 AR 对象时不会引发错误?

这是我现在的代码。

class Joker < ActiveRecord::Base
  attr_accessible :username

  has_one :username
end

并在创建 Jokers_controller

@joker = Joker.new(params[:joker])

Rails 抛出此错误:

Username(#19110) expected, got String(#9130)

这是表单域

= form_for @joker do |f|
  - if @joker.errors.any?
    #error_explanation
      h2 = "#{pluralize(@joker.errors.count, "error")} prohibited this joker from being saved:"
      ul
        - @joker.errors.full_messages.each do |message|
          li = message


  = f.text_field :username

【问题讨论】:

  • 请向我们展示此操作的表单。我怀疑您将用户名作为字符串而不是关联的 ID 传递。无论如何,为什么Username 是一个模型?为什么必须与jokers 表分开?
  • 我进行了编辑以显示表单。我不确定如何传递关联 ID。用户名必须是模型,因为 Joker 和 Dancer 都需要用户名,并且这些用户名必须是唯一的。

标签: ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-3.2


【解决方案1】:

问题是因为您将username 作为文本字段传递,而Rails 期望它是Username 类的实例。我要做的不是拥有Username 模型,而是对DancerJoker 模型进行验证,检查另一个模型是否存在冲突的用户名。这很简单:

 class Dancer < ActiveRecord::Base
   validate :unique_username

   # your model code goes here

   private

     def unique_username
       if Joker.find_by_username(username)
         errors.add(:username, "is already taken")
       end
     end
  end

所以删除Username 模型和相关表,并在dancersjokers 中只添加一个username 字符串字段,并在模型中进行此验证。

【讨论】:

  • 但是我如何确保两者都有唯一的用户名?如果两个表在用户名上都有自己的唯一索引,则可能存在可能导致问题的竞争条件
【解决方案2】:

我通过将应用程序切换到 mongodb 解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多