长时间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没有正确确定范围。我批准的答案修正了这一点。
我仍然想知道这是否被称为特定的东西,因为它看起来似乎经常使用。
答案 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")