0

У меня есть модель Transaction, где from_owner является полиморфной, поскольку транзакция может быть получена из нескольких других моделей.Rails принадлежит_to с условиями по исходящей таблице

class Transaction < ActiveRecord::Base 
    belongs_to :from_owner, polymorphic: true 
end 

Я пытаюсь создать конкретный belongs_to для того, когда from_owner_type является конкретным значением:

belongs_to :from_person, 
      conditions: ['from_owner_type = ?', Person.name], 
      class_name: Person, 
      foreign_key: 'from_owner_id' 

Проблемы Я сталкиваюсь, что conditions, кажется, для Person и не Transaction. Таким образом, я получаю следующее SQL ошибка при попытке вызвать from_person на Transaction:

ActiveRecord :: StatementInvalid: SQLite3 :: SQLException: нет такой колонки: from_owner_type: SELECT "люди" * FROM "людей", где «люди. ». "ID"= 1 AND (from_owner_type = 'Person') LIMIT 1

То, что я хочу, чтобы from_person на Transaction вернуть nil если Transactionfrom_owner_type не Person, а в противном случае возвращает связанную Person. Я мог бы создать настраиваемый метод from_person, который делает это, но я думал, что это возможно в качестве belongs_to. Я хочу использовать это с условиями CanCan. Я использую Rails 3.

+0

Вы просто хотите, чтобы это как отдельный метод доступа к владельцу (если это «Лицо»), а не это, фактически, отдельная ассоциация? В этом случае кажется, что пользовательский метод будет лучшим вариантом, чем попытка сгибать 'belongs_to', чтобы сделать что-то другое, чем то, для чего оно предназначалось. Есть ли конкретная причина, по которой вы не хотите использовать собственный метод? –

+0

Я надеялся, в CanCan, определить способ, например 'can: read, Transaction, from_person: {profile_id: profile.id}', который, как мне кажется, требует отношения, а не только метода. Я думаю, что мне придется делать свои определения по-разному, используя область видимости и блок, поэтому на этот вопрос лучше всего ответить «определить метод экземпляра». –

+0

При настройке хэша условий в CanCan вам нужно использовать столбцы базы данных ([см. CanCan wiki] (https://github.com/ryanb/cancan/wiki/Defining-Abilities#hash-of-conditions)), поэтому я подозреваю, что ваш подход может не работать. Можете ли вы не просто добавить проверку имени класса в часть условий? –

ответ

0

Из ваших комментариев кажется, что целью этого является создание правила CanCan, которое позволяет пользователю :read любой Transactions, что они являются владельцем, правильно? Вы должны быть в состоянии сделать это с помощью следующего правила:

can :read, Transaction, from_owner_id: profile.id, from_owner_type: Person.name 

и что должно означать, что вам не нужно беспокоиться Мессинг что-нибудь с вашей Transaction модели вообще. (Я не тестировал это, но теория должна быть правильной, даже если синтаксис не совсем там. Например, я не совсем уверен, откуда вы пришли profile.id.)

+0

Нет, есть еще один слой косвенности: 'from_owner_id' не будет для' Profile', а 'Person'. Поэтому мне нужно 'from_owner: {profile_id: @ profile.id}'. Мне нужно перейти из 'Transaction' =>' Person', чтобы получить доступ к 'profile_id' на' Person'. –

+0

Не совместимо ли это с условием 'from_owner_type'? то есть. 'can: read, Transaction, from_owner_type: Person.name, from_owner: {profile_id: @ profile.id}'? Возможно, это не так, просто гадать, поскольку я не использовал CanCan с полиморфной ассоциацией сам :) –