2014-12-07 62 views
0

我是新來的導軌,我想知道如何獲取一對一的關係。我想取用戶城市。在我的PostgreSQL數據庫,我有:如何在導軌中調用一對一關係

cities Table: 

city:varchar 
zipcode: integer 

users Table 

name:varchar 
city_id:int 

,並在城市和用戶模型我有:

class City < ActiveRecord::Base 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    has_one :city 

    devise :database_authenticatable, :registerable, 
      :recoverable, :rememberable, :trackable, :validatable 

end 

我想在我的搜索控制器,但沒有工作,下面登錄時:

current_user.city 

我收到以下錯誤

Processing by SearchController#index as HTML 
    Parameters: {"utf8"=>"✓", "q"=>"", "criteria"=>"1", "commit"=>"Search"} 
    User Load (1.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = 6 ORDER BY "users"."id" ASC LIMIT 1 
PG::UndefinedColumn: ERROR: column cities.user_id does not exist 
LINE 1: SELECT "cities".* FROM "cities" WHERE "cities"."user_id" =... 
               ^
: SELECT "cities".* FROM "cities" WHERE "cities"."user_id" = $1 LIMIT 1 
Completed 500 Internal Server Error in 11ms 

ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR: column cities.user_id does not exist 
LINE 1: SELECT "cities".* FROM "cities" WHERE "cities"."user_id" =... 
               ^
: SELECT "cities".* FROM "cities" WHERE "cities"."user_id" = $1 LIMIT 1): 

爲什麼我想在城市表中添加一個user_id列,當我有城市外鍵在用戶表中?我不想將user_id添加到城市表格中。

+0

因爲我只希望它有在城市表中的郵政編碼和城市。然後我希望活動記錄爲我的用戶獲取這個城市對象 – 2014-12-07 15:12:26

+0

[根據has_one的導軌指南](http://guides.rubyonrails.org/association_basics.html#the-has-one-association)'該關聯指示模型的每個實例都包含或擁有另一個模型的一個實例。「因此,您的用戶只有一個城市?或者你的意思是多對多關聯?([許多用戶可以擁有多個城市?](http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association))i認爲你搜索['has_one:通過關聯]](http://guides.rubyonrails.org/association_basics.html#the-has-one-through-through-association) – 2014-12-07 15:21:22

+0

是1用戶有1個城市,你可以在我的映射中看到 – 2014-12-07 15:24:16

回答

1

你的模型定義,您可以使用has_one :through association與連接表。下面是你的一些例子。

用戶模型:

class User < ActiveRecord::Base 
    has_one :city, through: :user_city 
    has_one :user_city 
end 

城市模型:

class City < ActiveRecord::Base 
    belongs_to :user 
end 

用戶城市加盟模式:

class UserCity < ActiveRecord::Base 
    belongs_to :city 
    belongs_to :user 
end 

遷移連接表:

class JoinUserCity < ActiveRecord::Migration 
    def change 
    create_table :user_cities do |t| 
     t.integer :user_id 
     t.integer :city_id 
    end 
    end 
end 

測試中軌控制檯:

=> u = User.create 
    (0.1ms) begin transaction 
SQL (0.5ms) INSERT INTO "users" ("created_at", "updated_at") VALUES (?, ?) [["created_at", "2014-12-07 15:47:14.595728"], ["updated_at", "2014-12-07 15:47:14.595728"]] 
    (3.3ms) commit transaction 
=> #<User id: 4, created_at: "2014-12-07 15:47:14", updated_at: "2014-12-07 15:47:14"> 
=> u.city 
    City Load (0.2ms) SELECT "cities".* FROM "cities" INNER JOIN "user_cities" ON "cities"."id" = "user_cities"."city_id" WHERE "user_cities"."user_id" = ? LIMIT 1 [["user_id", 4]] 
=> nil 
=> c = City.create 
    (0.1ms) begin transaction 
    SQL (0.5ms) INSERT INTO "cities" ("created_at", "updated_at") VALUES (?, ?) [["created_at", "2014-12-07 15:47:24.535039"], ["updated_at", "2014-12-07 15:47:24.535039"]] 
    (3.3ms) commit transaction 
=> #<City id: 1, created_at: "2014-12-07 15:47:24", updated_at: "2014-12-07 15:47:24"> 
irb(main):004:0> u.city = c 
    UserCity Load (0.3ms) SELECT "user_cities".* FROM "user_cities" WHERE "user_cities"."user_id" = ? LIMIT 1 [["user_id", 4]] 
    (0.1ms) begin transaction 
    SQL (0.4ms) INSERT INTO "user_cities" ("city_id", "user_id") VALUES (?, ?) [["city_id", 1], ["user_id", 4]] 
    (1.0ms) commit transaction 
=> #<City id: 1, created_at: "2014-12-07 15:47:24", updated_at: "2014-12-07 15:47:24"> 
irb(main):005:0> u.save 
    (0.1ms) begin transaction 
    (0.1ms) commit transaction 
=> true 
=> u = User.last 
    User Load (0.3ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 
=> #<User id: 4, created_at: "2014-12-07 15:47:14", updated_at: "2014-12-07 15:47:14"> 
=> u.city 
    City Load (0.2ms) SELECT "cities".* FROM "cities" INNER JOIN "user_cities" ON "cities"."id" = "user_cities"."city_id" WHERE "user_cities"."user_id" = ? LIMIT 1 [["user_id", 4]] 
=> #<City id: 1, created_at: "2014-12-07 15:47:24", updated_at: "2014-12-07 15:47:24"> 
1

看看HAS_ONE和belogns_to的文件,

belongs_to(name, options = {}) 
Specifies a one-to-one association with another class. This method should only be used if this class  
contains the foreign key. If the other class contains the foreign key, then you should use has_one 
instead. 

爲用戶的表有外鍵,你應該改變這樣的

class City < ActiveRecord::Base 
    has_one :user 
end 

class User < ActiveRecord::Base 
    belongs_to :city 
end 
相關問題