У меня есть модель ActiveRecord под названием Books
, которая имеет ассоциацию has_one
для authors
и ассоциацию has_many
для publishers
. Итак, следующий код хорош
books
.publishers
Теперь у меня есть другая модель AR, digital_publishers
, которая похожа, но которую я хотел бы прозрачно использовать, если автор книги ответит на digital?
- позвольте мне объяснить с помощью некоторого кода.
normal_book = Book.find(1)
normal_book.author.digital? #=> false
normal_book.publishers #=> [Publisher1, Publisher2, ...]
digital_book = Book.find(2)
digital_book.digital? #=> true
digital_book.publishers #=> I want to use the DigitalPublishers class here
Итак, если автор книги является цифровым (автор устанавливается через ассоциацию has_one :author
, поэтому это не так просто, как иметь has_many с условием SQL в таблице books), я все еще хочу иметь возможность вызывать .publishers
для нее, но иметь это вернуть список DigitalPublishers
, поэтому мне нужно какое-то условие для моей ассоциации has_many
, которое сначала проверяет, является ли книга цифровой, и если это так, используйте класс DigitalPublishers
вместо класса Publishers
.
Я попытался использовать обратный вызов after_find
, используя следующий код:
after_find :alias_digital_publisher
def alias_digital_publisher
if self.author.digital?
def publishers
return self.digital_publishers
end
end
end
Но это, похоже, не помогло. Кроме того, я использую Rails 2.3.