我在铁轨上学习红宝石,这是我在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 []>
我认为这两个对象的关联应该是我自动搜索的,但我不知道我错过了什么。我是否需要手动设置从该品牌到用户的关联?
由于
答案 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">
我希望这段关系的例子可以帮助其他初学者。