多态关联,创造记录

Polymorphic association, creating a record

我正在尝试为 GroupItem 记录播种,但我没有在创建方法中提供正确的数据。

这是我在 rails 控制台中尝试的:

irb(main):055:0> group = Group.first
  Group Load (0.2ms)  SELECT  "groups".* FROM "groups" ORDER BY "groups"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<Group id: 1, groupable_type: "Legislator", name: "Cool Peeps", created_at: "2017-02-23 01:13:21", updated_at: "2017-02-23 01:13:21">

irb(main):056:0> person = Role.first
  Role Load (0.2ms)  SELECT  "roles".* FROM "roles" ORDER BY "roles"."role_id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<Role role_id: 100, caucus: nil, congress_numbers: "[106]", current: false, description: "Representative for Wisconsin's 2nd congressional d...", district: 2, enddate: "2001-01-03", address: nil, contact_form: nil, fax: nil, office: nil, rss_url: nil, how: nil, leadership_title: nil, party: "Democrat", person_id: 400013, phone: nil, role_type: "representative", role_type_label: "Representative", senator_class: nil, senator_rank: nil, startdate: "1999-01-06", state: "WI", title: "Rep.", title_long: "Representative", website: "", created_at: "2017-02-23 01:11:08", updated_at: "2017-02-23 01:11:08">

irb(main):059:0> GroupItem.create(group_id: group.id, groupable_type: group.groupable_type, groupable_id: person.id)
   (0.1ms)  begin transaction
  Legislator Load (0.1ms)  SELECT  "legislators".* FROM "legislators" WHERE "legislators"."id" = ? LIMIT ?  [["id", 100], ["LIMIT", 1]]
  Group Load (0.1ms)  SELECT  "groups".* FROM "groups" WHERE "groups"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
   (0.1ms)  rollback transaction
=> #<GroupItem id: nil, group_id: 1, groupable_type: "Legislator", groupable_id: 100, created_at: nil, updated_at: nil>

设置如下:

class Group < ApplicationRecord
    has_many :group_items
end

class GroupItem < ApplicationRecord
    belongs_to :groupable, polymorphic: true
    belongs_to :group 
end

class Role < ApplicationRecord
    belongs_to :person, foreign_key: :person_id
    has_many :group_items, as: :groupable
    #....
end

# migrations...


class CreateGroups < ActiveRecord::Migration[5.0]
  def change
    create_table :groups do |t|
      t.string :name

      t.timestamps
    end
  end
end

class CreateGroupItems < ActiveRecord::Migration[5.0]
  def change
    create_table :group_items do |t|
      t.integer :group_id
      t.references :groupable, polymorphic: true, index: true

      t.timestamps
    end
  end
end

class CreateRoles < ActiveRecord::Migration[5.0]
  def change
    create_table :roles, :id => false do |t|
         t.primary_key :role_id
         #...

         t.timestamps

    end
  end
end

这一定是关联的问题,这是我第一次尝试多态,所以我可能在那里搞砸了。

我通过这样做解决了这个问题:

   new_item = GroupItem.new(group_id: group.id)
   new_item.update_attribute(:groupable, person)

irb(main):046:0> new_item = GroupItem.new(group_id: group.id)
=> #<GroupItem id: nil, group_id: 1, groupable_type: nil, groupable_id: nil, created_at: nil, updated_at: nil>

irb(main):047:0> new_item.update_attribute(:groupable, person)
   (0.1ms)  begin transaction
  SQL (0.4ms)  INSERT INTO "group_items" ("group_id", "groupable_type", "groupable_id", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?)  [["group_id", 1], ["groupable_type", "Role"], ["groupable_id", 29], ["created_at", 2017-02-23 03:14:33 UTC], ["updated_at", 2017-02-23 03:14:33 UTC]]
   (1.6ms)  commit transaction
=> true

irb(main):049:0> new_item
=> #<GroupItem id: 3, group_id: 1, groupable_type: "Role", groupable_id: 29, created_at: "2017-02-23 03:14:33", updated_at: "2017-02-23 03:14:33">