BEGINNER--怀疑为什么has_and_belong_to_many关联只是单向工作

时间:2016-06-14 17:36:34

标签: ruby-on-rails activerecord

我在铁轨上学习红宝石,这是我在SO中的第一个问题。我正在制作数据库来管理产品。在我的squema的一部分,我有可以拥有许多品牌的用户,以及可以拥有许多用户的品牌。所以我的squema看起来像这样:

class Brand < ActiveRecord::Base
  has_and_belongs_to_many :users
  .
  .
  .
end
class User < ActiveRecord::Base
  has_and_belongs_to_many :brands
  .
  .
  .
end
ActiveRecord::Schema.define(version: 20160614163029) do

  create_table "brands", force: :cascade do |t|
    t.string   "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "brands_users", id: false, force: :cascade do |t|
    t.integer "user_id"
    t.integer "brand_id"
  end

  add_index "brands_users", ["brand_id"], name: "index_brands_users_on_brand_id"
  add_index "brands_users", ["user_id"], name: "index_brands_users_on_user_id"

  create_table "users", force: :cascade do |t|
    t.string   "name"
    t.string   "email"
    t.datetime "created_at",                        null: false
    t.datetime "updated_at",                        null: false
    t.string   "password_digest"
    t.string   "remember_digest"
    t.boolean  "admin",             default: false
    t.string   "activation_digest"
    t.boolean  "activated",         default: false
    t.datetime "activated_at"
    t.string   "reset_digest"
    t.datetime "reset_sent_at"
  end

  add_index "users", ["email"], name: "index_users_on_email", unique: true

end

因此,当我创建用户时,必须输入其品牌名称,以便我可以创建与该用户相关联的品牌。

user.brands.create(name: "Boo")

这创建了用户与品牌的关联,因此我可以调用user.brands,它给了我&#34; Boo&#34;。我的问题是,当我打电话时:

brand.users

我得到了

#<ActiveRecord::Associations::CollectionProxy []>

我认为这两个对象的关联应该是我自动搜索的,但我不知道我错过了什么。我是否需要手动设置从该品牌到用户的关联?

由于

1 个答案:

答案 0 :(得分:0)

固定。重新加载控制台修复了该问题。现在它的工作方式就像我想要的那样:

2.3.1 :001 > user = User.second
User Load (0.4ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id" ASC LIMIT 1 OFFSET 1
=> #<User id: 2, name: "Luis Hirthe DVM", email: "example-1@example.org", created_at: "2016-06-14 16:52:17", updated_at: "2016-06-14 16:52:17">

2.3.1 :002 > user.brands.create(name: "Foo")
(0.1ms)  SAVEPOINT active_record_1
SQL (0.5ms)  INSERT INTO "brands" ("name", "created_at", "updated_at") VALUES (?, ?, ?)  [["name", "Foo"], ["created_at", "2016-06-14 20:23:08.410200"], ["updated_at", "2016-06-14 20:23:08.410200"]]
SQL (0.2ms)  INSERT INTO "brands_users" ("user_id", "brand_id") VALUES (?, ?)  [["user_id", 2], ["brand_id", 1]]
(0.1ms)  RELEASE SAVEPOINT active_record_1
=> #<Brand id: 1, name: "Foo", created_at: "2016-06-14 20:23:08", updated_at: "2016-06-14 20:23:08">

2.3.1 :003 > brand = Brand.first
Brand Load (0.3ms)  SELECT  "brands".* FROM "brands"  ORDER BY "brands"."id" ASC LIMIT 1
=> #<Brand id: 1, name: "Foo", created_at: "2016-06-14 20:23:08", updated_at: "2016-06-14 20:23:08">

2.3.1 :004 > brand.users.all
User Load (0.2ms)  SELECT "users".* FROM "users" INNER JOIN "brands_users" ON "users"."id" = "brands_users"."user_id" WHERE "brands_users"."brand_id" = ?  [["brand_id", 1]]
=> #<ActiveRecord::AssociationRelation [#<User id: 2, name: "Luis Hirthe DVM", email: "example-1@example.org", created_at: "2016-06-14 16:52:17", updated_at: "2016-06-14 16:52:17">

我希望这段关系的例子可以帮助其他初学者。