0

編集:別の回答で提案されているように、データベースを削除して再作成しましたが、変更はありません。また、通常とは異なる方法でタグを使用しているため、acts_as_taggable のような gem を使用できません。

スタック オーバーフローに関する最初の質問です。非常に単純な関連付けを適切に機能させるのに少し問題があり、その理由がわかりません。私はSOとドキュメントを見てかなりの時間を費やしましたが、私が持っているものはうまくいくはずです。ユーザーと注文に属する「タグ」モデルを追加しています。また、ユーザーと注文モデルに has_many :tags も追加しました。作成したモデルのスキーマは次のとおりです。

create_table "tags", force: true do |t|
    t.string   "name"
    t.string   "color"
    t.integer  "order_id"
    t.integer  "user_id"
    t.datetime "created_at"
    t.datetime "updated_at"
end

add_index "tags", ["order_id"], name: "index_tags_on_order_id", using: :btree
add_index "tags", ["user_id"], name: "index_tags_on_user_id", using: :btree

Rails コンソールで、ユーザー アソシエーションを使用してタグを作成できます。

this_tag = Tag.new(name:"Urgent", color: "red", user_id: 1)

タグユーザーを取得できます

this_tag.user

しかし、ユーザータグを取得できません

a_user = User.first
a_user.tags

それは私に与える:

User Load (0.9ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1
 => #<User id: 1, email: "redacted", encrypted_password: "$2a$10$kdEgXW61I3b3Bu9Rbs3W0ex1jxTmIFWVe1jabDY9q9.U...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 5, current_sign_in_at: "2013-10-29 22:12:57", last_sign_in_at: "2013-10-29 21:59:13", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2013-10-23 23:49:00", updated_at: "2013-10-29 22:12:57", name: "Jordan"> 
2.0.0-p247 :006 > me.tags
PG::UndefinedTable: ERROR:  relation "user_tags" does not exist
LINE 5:                WHERE a.attrelid = '"user_tags"'::regclass
                                          ^
:               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                     pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
                FROM pg_attribute a LEFT JOIN pg_attrdef d
                  ON a.attrelid = d.adrelid AND a.attnum = d.adnum
               WHERE a.attrelid = '"user_tags"'::regclass
                 AND a.attnum > 0 AND NOT a.attisdropped
               ORDER BY a.attnum

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "user_tags" does not exist
LINE 5:                WHERE a.attrelid = '"user_tags"'::regclass
                                          ^
:               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                     pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
                FROM pg_attribute a LEFT JOIN pg_attrdef d
                  ON a.attrelid = d.adrelid AND a.attnum = d.adnum
               WHERE a.attrelid = '"user_tags"'::regclass
                 AND a.attnum > 0 AND NOT a.attisdropped
               ORDER BY a.attnum

これは奇妙なエラーのように思われ、それを参照する SO 投稿のどれも私のような問題を抱えているようには見えません。ユーザーの注文を取得できます

a_user.orders

注文モデルのスキーマは非常に似ていますが、唯一の違いは、注文モデルにインデックスが追加されていないことです...

インデックスが注文を台無しにしていますか? その厄介なエラーの原因は何ですか?

追加情報:

このモデルを思い通りに定義するのに苦労していたので、約 3 つの移行を作成してからロールバックし、git reset --hard HEAD を使用して他のすべてをロールバックし、毎回最初からやり直しました。

要求どおり、私のユーザー モデルは次のとおりです。

class User < ActiveRecord::Base
    has_many :orders
    has_many :tags
  rolify

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
end

私のタグモデルは

class Tag < ActiveRecord::Base
  belongs_to :user
  belongs_to :order
end
4

1 に答える 1