如何正确定义此自定义标记关系?

时间:2013-10-31 16:29:18

标签: ruby-on-rails database activerecord

编辑:我已经删除并重新创建了数据库,正如其他答案所示,没有任何变化。另外,我不能使用类似acts_as_taggable的gem,因为我使用的标签与普通标签不同。

关于堆栈溢出的第一个问题!我在使用一个非常简单的关联工作方面遇到了一些麻烦,我不知道为什么。我花了很多时间看SO和docs,在我看来,我所拥有的应该是有效的。我正在添加一个"标签"属于用户和订单的模型,我还向用户和订单模型添加了has_many:标签。这是我创建的模型的架构:

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

和我的订单模式的架构非常相似,唯一的区别是我没有将索引添加到我的订单模型中...

索引是否搞砸了我的订单?是什么导致了这个令人讨厌的错误?

附加信息:

我在定义这个模型时遇到了麻烦,所以我创建了大约三次迁移,然后将它们回滚,并使用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

1 个答案:

答案 0 :(得分:0)

我找到了问题的原因,这绝对是我的错。先前版本的标记模型迁移在名为users的文件夹中留下了额外的tag.rb模型。我想我只是没有注意到该文件夹​​,或者认为它与User模型有关。我也会想到运行git reset - hard HEAD就可以恢复我所做的任何改变,但是这种方式有所改变 - 也许它没有添加到我的索引中? 在任何情况下,它都是导致问题的额外tag.rb模型。