【问题标题】:Rails Associations for Lookup Table查找表的 Rails 关联
【发布时间】:2012-05-29 04:39:34
【问题描述】:

我有一个仅包含 id 和名称字段(活动、非活动、待定等)的状态表。然后,我有诸如用户、成就、徽章之类的表,其中每个表都包含一个 status_id 外键。我的模型中的关联看起来正确吗?

class Status < ActiveRecord::Base
  has_many :achievements
  has_many :badges
  has_many :users
end

class User < ActiveRecord::Base
  belongs_to :status
end

class Badge < ActiveRecord::Base
  belongs_to :status
end

class Achievement < ActiveRecord::Base
  belongs_to :status
end

在查找表的情况下,我正在努力了解如何正确读取 has_one 和 has_many 之间的区别。我知道一个用户拥有一家公司并拥有一份个人资料,而一家公司有很多用户,但这对我来说似乎倒退了。

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    最简单的关联设置是:

    class User < ActiveRecord::Base
      has_one :status
    end
    

    这正是您发布的内容。您的解决方案会起作用,但对于您所描述的内容来说太过分了。我在上面发布的所有关联都是向用户模型添加一种方法,即

    @user = User.find(1)
    @user.status
    

    另一方面,如果您想要简单的语义来显示具有特定状态的所有用户,那么您会添加

    class Status < ActiveRecord::Base
      has_many :users
    end
    

    所以现在你可以这样做了:

    @status = Status.find_by_description('Active').first()
    
    @status.users
    

    请注意,在这两种情况下,只需要用户模型具有属性“status_id”

    Belongs_to 更适合存在隐式层次结构,即,

    class Child << ActiveRecord::Base
       belongs_to :parent
    end
    

    【讨论】:

    • 感谢您的详细解答。关于belongs_to ...我确实阅读了rails网站上的一些文档,其中说包含外键的表包含模型中的belongs_to。
    • 确实如此,但问题是您需要 belongs_to 引入的语义吗?即一个用户有一个状态,但一个状态是否属于一个用户?没有一个状态不属于一个用户,状态可以分配给多个用户,所以你可能永远不需要这样的查询语义,告诉我属于这个状态的用户。
    • 这实际上是一个很好的解释方式。非常感谢!
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多