【问题标题】:Correct ActiveRecord association for a reference table?正确引用表的 ActiveRecord 关联?
【发布时间】:2012-11-22 08:59:59
【问题描述】:

给定两个模型:

class User < ActiveRecord::Base
  attr_accessible :name, :user_status

end

class UserStatus < ActiveRecord::Base
  attr_accessible :descr
end

user.user_status 列旨在作为单个 ID,可用于加入 UserStatus 以获取其他信息,例如状态图标和描述。

UserStatus 是一个只读引用表,它的行数非常少,而且都是唯一的。假设它只有四行:

{ :id => 0, :descr => 'New' },
{ :id => 1, :descr => 'Banned' },
{ :id => 2, :descr => 'Active' },
{ :id => 3, :descr => 'Unverified' }

我应该为引用表处理 ActiveRecord 关联吗?如果是这样,如果我想(或必须)将关联的 UserStatus ID 存储在用户表中,那么正确的 ActiveRecord 关联是什么?据我所知,基于documentation,'User belongs_to :user_status' 是我最好的选择,但在语言上这是失败的;因为用户不“属于”状态,所以用户处于状态或具有状态。还是这太让我毛骨悚然了?

【问题讨论】:

    标签: ruby ruby-on-rails-3 activerecord relational-database


    【解决方案1】:

    belongs_to 并不总是具有语言意义,但在这种情况下,这正是您想要的。

    UserStatus has_many :users
    User belongs_to :user_status
    

    这还允许状态查找处于该状态的所有用户,这可能很有用。

    naughtyPeople = UserStatus.where(descr: 'Banned').users
    

    从语言上讲,更重要的是您决定使用什么 API 来获取这些数据。

    User.find(123).user_status.descr
    

    那种感觉很糟糕。它有你想要的关系,但是 API 非常冗长。

    class User
      def status
        user_status.descr
      end
    end
    
    User.find(123).status
    

    好多了。

    甚至可能是这个!

    class User
      def status
        user_status.descr
      end
    
      def status=(status_string)
        self.user_status = UserStatus.where(descr: status_string).first
      end
    end
    
    user = User.find(123)
    user.status = 'Banned'
    user.user_status #=> { id: 3, descr: "Banned" }
    

    你想按摩多远取决于你。

    【讨论】:

    • 这真的很有帮助。谢谢,亚历克斯!
    猜你喜欢
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多