多态协会,创建一个记录

多态协会,创建一个记录

问题描述:

我想种子GroupItem记录,但我没有提供正确的数据到创建方法。多态协会,创建一个记录

下面是我在轨控制台尝试:

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 

它必须与协会的一个问题,这是我的第一次创业到多态所以我可能搞砸了一些东西。

+1

会发生什么事,如果你做'group_item.errors.full_messages.to_sentence'?另外,你的'groupable_type'是一个'Group',但你的'groupable_id'是一个'Person'吗? –

+0

是的,我把多态关联放在Group上而不是GroupItem上。 –

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

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">