2017-01-14 2 views
2

Я в настоящее время пытаюсь внедрить модель Category в свое приложение. Я пытаюсь спроектировать его таким образом, что Users может иметь много Categories, а так же может Groups.Ruby on Rails - Полиморфная ассоциация со скидками

Проблема, с которой я столкнулся, заключается в том, что я также хочу иметь обычный список Categories, если они не назначены ни одному User или Group.

Я ссылался на rubyonrails.org/association_basics.

class CreateCategories < ActiveRecord::Migration[5.0] 
    def change 
    create_table :categories do |t| 
     t.string :name 
     t.text :description 
     t.references :categorizable, polymorphic: true, index: true 
     t.timestamps 
    end 
    end 
end 

class Category < ApplicationRecord 
    belongs_to :categorizable, :polymorphic => true 
end 

class User < ApplicationRecord 
    has_many :categories, :as => :categorizable 
end 

class Group< ApplicationRecord 
    has_many :categories, :as => :categorizable 
end 

Я пытаюсь создать новый Category через rails c, но всякий раз, когда я пытаюсь сохранить, она катится назад моя сделка, вероятно, потому, что не хватает какое-то состояние.

Category(id: integer, name: string, description: text, created_at: datetime, updated_at: datetime) 

Category.create(:id => 1, :name => 'Category_1', :description => '') 
begin transaction 
rollback transaction 

Я также чувствую, что есть лучший способ, чтобы создать новую Category, так как я не должен быть установка id вручную.

Благодарим за помощь.

+0

Вы используете рельсы 5? – usha

+0

Если вы не должны устанавливать идентификатор, почему вы это делаете? Является ли 'begin transaction' и' rollback transaction' все, что вы можете видеть в журнале? – chumakoff

ответ

1

В рельсах 5, всякий раз, когда вы определяете ассоциацию belongs_to, по умолчанию требуется наличие соответствующей записи. Вы бы видели это, когда вы смотрите на ошибки при попытке создать объект категории

category = Category.create(:name => 'Category_1', :description => '') 
category.errors.full_messages.to_sentence 

Если вы хотите, чтобы иметь возможность сохранить запись без belongs_to ассоциации, вы должны указать его явно

class Category < ApplicationRecord 
    belongs_to :categorizable, polymorphic: true, required: false 
end 
+0

Мне удалось создать категорию отдельно от группы/пользователей, но как мне назначить группу категории? Например, я создаю 10 категорий и позволяю группировать категорию в существующие категории, а не создавать новые. –

+0

На самом деле, я думаю, я понял это. Я сделал 'Category.create! (...)', а затем 'group.categories << Category.find (4)'. Правильно ли это звучит? –

+0

да, это должно работать – usha

0

Это должно помочь, Rails Cast на Полиморфные https://www.youtube.com/watch?v=6l9EAuev16k

Вы можете создать полиморфные записи с этим ...

`@category = @categorizable.User.new` 
`@category = @categorizable.Group.new` 

Так что вам не нужен идентификатор.

+1

Я получаю нуль за '@ категоризуемый'. –

+0

То же самое, похоже, это было бы неплохо, но это не работает для меня. –

1

Если вы попытаетесь создать новую категорию и увидите ошибку, то для создания категории должна существовать категоризированная запись, простой способ сделать это - поставить новый объект как категорируемый и он должен сделать трюк.

$ category = Category.new 
=> #<Category id: nil, name: nil, description: nil, categorizable_type: nil, categorizable_id: nil, created_at: nil, updated_at: nil> 
$ category.save 
    (0.1ms) begin transaction 
    (0.1ms) rollback transaction 
=> false 
$ category.errors.full_messages 
=> ["Categorizable must exist"] 
$ category = Category.new(categorizable: category) 
=> #<Category id: nil, name: nil, description: nil, categorizable_type: "Category", categorizable_id: nil, created_at: nil, updated_at: nil> 
$ category.save 
(0.1ms) begin transaction 
SQL (1.3ms) INSERT INTO "categories" ("categorizable_type", "created_at", "updated_at") VALUES (?, ?, ?) [["categorizable_type", "Category"], ["created_at", 2017-01-15 00:08:55 UTC], ["updated_at", 2017-01-15 00:08:55 UTC]] 
(0.7ms) commit transaction 
=> true