Rails多态关联在模型中不可用

时间:2016-03-17 00:12:38

标签: ruby-on-rails ruby-on-rails-4 polymorphic-associations

我是铁杆新手,所以请耐心等待,我整天都在搜索。如果这是初学者问题,请道歉:)

我有一个定义了多态关联的模型:

class SocialLink < ActiveRecord::Base
  belongs_to :social, polymorphic: true
end

两个应该具有此关联之一的模型

class Staff < ActiveRecord::Base
  validates :name, presence: true
  belongs_to :establishment
  has_one :image, as: :imageable
  has_one :social_link, as: :social
end


class Establishment < ActiveRecord::Base
  validates :name, presence: true
  has_one :location
  has_one :social_link, as: :social
  has_many :staff

  accepts_nested_attributes_for :location
  accepts_nested_attributes_for :staff
end

编辑:社交链接的初始表创建迁移

class CreateSocialLinks < ActiveRecord::Migration
  def change
    create_table :social_links do |t|
      t.string :facebook
      t.string :twitter
      t.string :yelp
      t.string :google_plus
      t.string :youtube
      t.string :instagram
      t.string :linkedin

      t.timestamps null: false
    end
  end
end

此处的迁移就是这样创建的(编辑:请注意迁移时存在的表格)

class AddSocialLinkReferenceToEstablishmentAndStaff < ActiveRecord::Migration
  def change
    add_reference :social_links, :social_links, polymorphic: true, index: true
  end
end


class UpdateSocialLinkReference < ActiveRecord::Migration
  def change
    remove_reference :social_links, :social_links
    add_reference :social_links, :social, polymorphic: true, index: true
  end
end

编辑:在上述迁移之后,可以使用social_id和social_type

#<SocialLink id: nil, facebook: nil, twitter: nil, yelp: nil, google_plus: nil, youtube: nil, instagram: nil, linkedin: nil, created_at: nil, updated_at: nil, social_id: nil, social_type: nil> 

但是,出于某种原因,这两种型号都无法使用该关联。我无法看到我做错了什么,看起来我把它设置为与正在工作的图像模型上的另一个多态关联相同

这个正在运作

class Image < ActiveRecord::Base
  belongs_to :imageable, polymorphic: true
end

谢谢或帮助!

2 个答案:

答案 0 :(得分:0)

根据rails guide on polymorphic associations,您的迁移应该更像这样:

class CreateSocialLinks < ActiveRecord::Migration
  def change
    create_table :social_links do |t|
      t.string :name
      t.references :social, polymorphic: true, index: true
      t.timestamps null: false
    end
  end
end

否则该表将被误导

答案 1 :(得分:0)

问题在于我试图使用多态名称来访问关联,而不仅仅是使用模型名称。而不是做staff.social我应该使用staff.social_link。我对此感到困惑。

对不起有困惑