Полиморфная ассоциация по полям UUID и Integer
Приведенные таблицы с integer
и uuid
основными ключами - лучший способ интегрировать полиморфное соединение (has_many
)? Например:
class Interest < ActiveRecord::Base
# id is an integer
has_many :likes, as: :likeable
end
class Post < ActiveRecord::Base
# id is a UUID
has_many :likes, as: :likeable
end
class User < ActiveRecord::Base
has_many :likes
has_many :posts, through: :likes, source: :likeable, source_type: "Post"
has_many :interests, through: :likes, source: :likeable, source_type: "Interest"
end
class Like < ActiveRecord::Base
# likeable_id and likeable_type are strings
belongs_to :likeable, polymorphic: true
belongs_to :user
end
Работает много запросов:
interest.likes
post.likes
user.likes
Однако:
user.interests
дает:
PG:: UndefinedFunction: ERROR: оператор не существует: целое число = символ меняется LINE 1:... интересы "INNER JOIN" нравится "ON" интересы "." Id "=" нравится ".... ^ СОВЕТ: оператор не соответствует указанному имени и типу аргументов. Возможно, вам придется добавлять явные типы.: SELECT" интересует ". * FROM" интересы "INNER JOIN" любит "ON" интересы "." Id "=" нравится "." Likeable_id "WHERE" нравится "." User_id "= $1 И" нравится "." Likeable_type" = $2
Какой лучший способ включить обеспечение правильного кастинга?
Ответы
Ответ 1
Я не очень хорошо разбираюсь в ActiveRecord, и это определенно не тот ответ, который вы ищете, но если вам нужно временное * уродливое обходное решение, пока вы не найдете решение, вы можете переопределить получателя:
class User
def interests
self.likes.select{|like| like.likeable._type == 'Interest'}.map(&:likeable)
end
end
* Очень уродливая причина, что он загрузит всех пользователей, а затем отсортирует их
EDIT Я нашел эту интересную статью:
self.likes.inject([]) do |result, like|
result << like.likeable if like.likeable._type = 'Interest'
result
end