这是我是如何做到的,可以生成正确的SQL查询语句:
class Message < ApplicationRecord
module FromTypes
USER = "User"
PHONE_NUMBER = "PhoneNumber"
ALL = [USER, PHONE_NUMBER]
end
module ToTypes
USER = "User"
PHONE_NUMBER = "PhoneNumber"
ALL = [USER, PHONE_NUMBER]
end
belongs_to :from, polymorphic: true
belongs_to :to, polymorphic: true
scope :from_user, -> { where(from_type: FromTypes::USER) }
scope :from_phone_number, -> { where(from_type: FromTypes::PHONE_NUMBER) }
scope :to_user, -> { where(to_type: ToTypes::USER) }
scope :to_phone_number, -> { where(from_type: ToTypes::PHONE_NUMBER) }
validates :from_type, presence: true, inclusion: { in: FromTypes::ALL }
validates :to_type, presence: true, inclusion: { in: ToTypes::ALL }
def from_user?
from_type == FromTypes::USER
end
def from_phone_number?
from_type == FromTypes::PHONE_NUMBER
end
def to_user?
to_type == ToTypes::USER
end
def to_phone_number?
to_type == ToTypes::PHONE_NUMBER
end
end
has_many(
:messages_sent,
-> { from_phone_number },
class_name: "Message",
foreign_key: :from_id
)
has_many(
:messages_received,
-> { to_phone_number },
class_name: "Message",
foreign_key: :to_id
)
这使得SQL查询变得像这样:
>> PhoneNumber.first.messages_received
PhoneNumber Load (1.1ms) SELECT "phone_numbers".* FROM "phone_numbers" ORDER BY "phone_numbers"."id" ASC LIMIT $1 [["LIMIT", 1]]
Message Load (2.1ms) SELECT "messages".* FROM "messages" WHERE "messages"."to_id" = $1 AND "messages"."from_type" = $2 /* loading for pp */ LIMIT $3 [["to_id", 1], ["from_type", "PhoneNumber"], ["LIMIT", 11]]