У меня есть модель 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
если Transaction
from_owner_type
не Person
, а в противном случае возвращает связанную Person
. Я мог бы создать настраиваемый метод from_person
, который делает это, но я думал, что это возможно в качестве belongs_to
. Я хочу использовать это с условиями CanCan. Я использую Rails 3.
Вы просто хотите, чтобы это как отдельный метод доступа к владельцу (если это «Лицо»), а не это, фактически, отдельная ассоциация? В этом случае кажется, что пользовательский метод будет лучшим вариантом, чем попытка сгибать 'belongs_to', чтобы сделать что-то другое, чем то, для чего оно предназначалось. Есть ли конкретная причина, по которой вы не хотите использовать собственный метод? –
Я надеялся, в CanCan, определить способ, например 'can: read, Transaction, from_person: {profile_id: profile.id}', который, как мне кажется, требует отношения, а не только метода. Я думаю, что мне придется делать свои определения по-разному, используя область видимости и блок, поэтому на этот вопрос лучше всего ответить «определить метод экземпляра». –
При настройке хэша условий в CanCan вам нужно использовать столбцы базы данных ([см. CanCan wiki] (https://github.com/ryanb/cancan/wiki/Defining-Abilities#hash-of-conditions)), поэтому я подозреваю, что ваш подход может не работать. Можете ли вы не просто добавить проверку имени класса в часть условий? –