这在技术上叫什么?

时间:2014-05-25 00:46:01

标签: ruby-on-rails rails-activerecord

长时间SO读者,第一次海报。我有一个项目,其模型具有相同Field Model的has_one Field和has_many。我只是希望能够将它们分开区分。这是我提出的最优雅的方式。

我想知道我应该如何口头提及我目前正在使用的方法,如果有更好的方法,可以使用Rails 4 +。

以下是我使用的代码:

    # field.rb
    class Field < ActiveRecord::Base
      belongs_to :user
    end

    # user.rb
    class User < ActiveRecord::Base
      has_one :primary_field, class_name: 'Field'
      has_many :secondary_fields, class_name: 'Field'
    end

u = User.create(name:"foo")
u.primary_field = Field.create(name:"ruby on rails")
u.secondary_fields << Field.create(name:"html/css") 
u.secondary_fields << Field.create(name:"javascript")

编辑:我的方法中存在一个错误,从技术上讲,secondary_fields没有正确确定范围。我批准的答案修正了这一点。

我仍然想知道这是否被称为特定的东西,因为它看起来似乎经常使用。

1 个答案:

答案 0 :(得分:1)

您需要一种方法来区分哪个字段是主要字段。您现在拥有的所有字段都相同,因此您可以从secondary_fields关联中获取所有这三个字段,primary_field实际上是随机的(取决于您使用的数据库和# 39;重新使用)。

如果您添加&#34;主要&#34;列到Field,您可以使用以下内容:

# field.rb
class Field < ActiveRecord::Base
  belongs_to :user
  validates :primary, uniqueness: {scope: user, if: :primary}
end

# user.rb
class User < ActiveRecord::Base
  has_one :primary_field, -> {where(primary: true), class_name: 'Field'
  has_many :secondary_fields, -> {where(primary: false)}, class_name: 'Field'
end

u = User.create(name:"foo")
u.primary_field = Field.create(name:"ruby on rails", primary: true)
u.secondary_fields << Field.create(name:"html/css") 
u.secondary_fields << Field.create(name:"javascript")