2016-07-13 3 views
0

Я хочу, чтобы получить идентификатор пользователя с видом трассировку связи в моем приложении Rails (2 уровня выше в отношении)Backtrace отношение в Rails 4

Мои модели

User.rb

has_many :printers, dependent: :destroy 
has_many :orders 

Printer.rb

belongs_to :user 
has_many :orders 

Order.rb

belongs_to :user 
belongs_to :printer 
has_many :messages, dependent: :destroy 

На мой взгляд (/ заказы/показать) для одного ордена

Order ID: <%= @order.id %> 
    Printer ID: <%= @order.printer_id %> 
    Performer ID: <%= ???? %> <!-- I need the owner of the given printer ID above --> 

Заказать показать действие простой

def show 
    @order = Order.find(params[:id]) #get current order 
end 

Так что я могу также просто получить идентификатор пользователя, потому что он было сделано через (идентификатор человека, разместившего заказ)

@order = current_user.orders.build(order_params) 

И придумайте с этим Пользователь, получаю любые данные, которые мне нужны

@order.user.first_name 

Но у меня есть идея, как я могу получить идентификатор владельца принтера в этом случае? Возможно ли это с моим типом модели или я должен реорганизовать все, что угодно, с has_many: через?

Любой ответ будет высоко оценен

схемы

create_table "orders", force: :cascade do |t| 
    t.integer "user_id" # this is an id of user who place the order 
    t.integer "printer_id" #this is and id of printer, which was ordered 
    end 

    create_table "printers", force: :cascade do |t| 
    t.integer "user_id" # this is the owner of printer - to which other user pass the order 
    end 

ответ

1

Это то, что through ассоциация для - хотя и не простой.

Если ваш заказ не есть пользователь, вы можете сделать это довольно просто с:

class Order 
    belongs_to :printer 
    has_one :user, :through => :printer 

Но вы не хотите, чтобы пользователь-что-владельцем-на-принтер путать с пользователь-созданный-порядок, поэтому нам нужно назвать его чем-то другим, но скажите, что он все еще является пользователем.

Вы можете попробовать следующее, я не проверял ... Вы, возможно, потребуется настроить его немного, чтобы заставить его работать, но это должно дать вам суть того, что должно быть сделано:

class Order 
    belongs_to :user 
    belongs_to :printer 
    has_one :printer_owner, :through => :printer, :class_name => :user, :foreign_key => :user_id 
Смежные вопросы