Подтвердить что ты не робот

Полиморфная ассоциация по полям 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

Какой лучший способ включить обеспечение правильного кастинга?

4b9b3361

Ответ 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