多态关联,创造记录
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">
我正在尝试为 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">