2017-01-14 24 views
2

私は現在、アプリケーションにCategoryモデルを実装しようとしています。私はUsersが多くの場合Categoriesを持つことができるように設計しようとしており、Groupsも可能です。Ruby on Rails - カテゴリとの多相関連

私が遭遇している問題は、UserまたはGroupに割り当てられていないCategoriesの正規リストを持つことができるようにしたいということです。

私は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 

私はrails cを通じて新しいCategoryを作成しようとしているが、私は保存しようとするたびに、私はいくつかの条件が欠けているので、それはおそらく私のトランザクションをロールバックします。

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

IDを設定してはならない場合、なぜそれをやっていますか? 'begin transaction'と' rollback transaction'はログにすべて表示されますか? – chumakoff

答えて

1

レール5では、belongs_toアソシエーションを定義するたびに、関連付けられたレコードがデフォルトで存在する必要があります。あなたは、カテゴリオブジェクトを作成しようとした後、エラーを見たとき、あなたがbelongs_toの関連付けずにレコードを保存することができるようにしたい場合は

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

、あなたが

class Category < ApplicationRecord 
    belongs_to :categorizable, polymorphic: true, required: false 
end 
明示的に指定する必要がありますあなたは、これを見るでしょう
+0

グループ/ユーザとは別のカテゴリを作成することはできましたが、どのようにグループをカテゴリに割り当てるのですか?たとえば、10個のカテゴリを作成し、新しいカテゴリを作成するのではなく、既存のカテゴリに分類することができます。 –

+0

実際、私はそれを理解したと思う。私は 'Category.create!(...)'を実行し、次に 'group.categories << Category.find(4)'を実行しました。それは正しいと思いますか? –

+0

はい、それはうまくいくでしょう – usha

0

これはポリモーフィック https://www.youtube.com/watch?v=6l9EAuev16k

にキャストRailsはあなたがあなたがIDを必要としない...これで

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

をポリモーフィックレコードを作成することができ、助けなければなりません。

+1

'@categorizable'にはnilが返されます。 –

+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 
関連する問題