2014-10-10 5 views
0

У меня есть инструкция по таблице:has_many через отношения к одной и той же модели

class User < ActiveRecord::Base 
    has_many :broker_clients, :class_name => "BrokerClients", :foreign_key => "broker_id" 
    has_many :clients, :through => :broker_clients, :foreign_key => "broker_id" 
    has_many :brokers, :through => :broker_clients, :foreign_key => "client_id" 
end 

И BrokerClients стол:

class BrokerClients < ActiveRecord::Base 
    belongs_to :broker, class_name: "User" 
    belongs_to :client, class_name: "User" 
end 

Теперь, когда я создаю связь:

>> BrokerClients.create(broker_id: User.first.id, client_id: User.last.id) 
    User Load (9.7ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1 
    User Load (1.3ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 
    (1.3ms) BEGIN 
    SQL (41.5ms) INSERT INTO "broker_clients" ("broker_id", "client_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["broker_id", 4], ["client_id", 210], ["created_at", Fri, 10 Oct 2014 13:43:27 EDT -04:00], ["updated_at", Fri, 10 Oct 2014 13:43:27 EDT -04:00]] 
    (0.5ms) COMMIT 
=> #<BrokerClients id: 1, broker_id: 4, client_id: 210, created_at: "2014-10-10 17:43:27", updated_at: "2014-10-10 17:43:27"> 
>> User.first.brokers.first 

Когда я пытаюсь чтобы клиенты работали нормально:

>> User.first.clients.first 
    User Load (0.6ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1 
    User Load (1.2ms) SELECT "users".* FROM "users" INNER JOIN "broker_clients" ON "users"."id" = "broker_clients"." 
=> #<User id: 210, .... 

Но для клиента, когда я пытаюсь получить брокерам, связанные с ним не будут работать:

>> User.last.brokers.first 
    User Load (0.7ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1 
    User Load (0.7ms) SELECT "users".* FROM "users" INNER JOIN "broker_clients" ON "users"."id" = "broker_clients"."broker_id" WHERE "broker_clients"."broker_id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["broker_id", 210]] 
=> nil 

Любая помощь?

ответ

1

Изменение в User modal как: -

has_many :broker_clients, :class_name => "BrokerClients", :foreign_key => "broker_id" 
has_many :clients, :through => :broker_clients, :foreign_key => "broker_id" 

has_many :inverse_broker_clients, :class_name => "BrokerClients", :foreign_key => "client_id" 
has_many :brokers, :through => :inverse_broker_clients, :foreign_key => "client_id" 
+0

Теперь я не могу получить доступ к клиентам.https://gist.github.com/eqbal/e5c08ae883079764e561 –

+0

попробуйте обновить сообщение. –

+0

Теперь работает как шарм, очень интересно. Спасибо чувак –

0

Посмотрите на ваш вкладышем против вашего запроса:

Вставка:

SQL (41.5ms) INSERT INTO "broker_clients" ("broker_id", "CLIENT_ID", "created_at", «updated_at ") ЦЕННОСТИ ($ 1, $ 2, $ 3, $ 4) RETURNING" id "[[" broker_id ", 4], [" client_id ", 210], [" created_at ", Пт, 10 окт 2014 13:43:27 EDT - 4:00], [ "updated_at", пт, 10 октября 2014 13:43:27 EDT -04: 00]]

Запросы:

Пользовательская нагрузка (0,7 мс) ВЫБРАТЬ «пользователей». * FROM «users» INNER JOIN «broker_clients» ON «users». «Id» = «broker_clients». «Broker_id» WHERE «broker_clients». «Broker_id» = $ 1 ORDER BY "пользователей". "ID" ASC LIMIT 1 [[ "broker_id", 210]]

вы вставляете (broker_id = 4, client_id = 210), но вы запрашиваете broker_id = 210. Вот почему вы получаете ноль за brokers.first. Уверен, вы иностранные ключи в обратном направлении:

has_many :clients, :through => :broker_clients, :foreign_key => "broker_id" 
has_many :brokers, :through => :broker_clients, :foreign_key => "client_id" 

Должно быть

has_many :clients, :through => :broker_clients, :foreign_key => "client_id" 
has_many :brokers, :through => :broker_clients, :foreign_key => "broker_id" 

Надежда, что помогает.

+0

Я изменил foreign_key, как вы предложили. Но все еще такая же проблема. У меня есть одно отношение (=> # ). Когда я пытаюсь использовать User.first.clients.first.id => 210, но когда я делаю User.last.brokers.first, я получаю nil :( –

+0

Сначала перезагрузите сервер, если вы этого еще не сделали. Во-вторых, отправьте свои SQL-запросы после того, как вы обновите отношения foreign_key, как рекомендовано. Насколько я могу судить, исправление ссылок foreign_key должно решить вашу проблему. По сути, вы указываете отношение has_many к неправильным объектам (то есть, broker -> client , клиент -> брокер). – mattforni

+0

Кроме того, один из ваших SQL-запросов в исходном сообщении отключен. Было бы полезно узнать, что такое полный запрос. – mattforni

Смежные вопросы