Ruby on rails 使用联接搜索rails应用程序查询的范围
很好,我正在尝试创建一个范围,通过关联模型的属性以及模型本身的属性来搜索关联模型的记录Ruby on rails 使用联接搜索rails应用程序查询的范围,ruby-on-rails,ruby,postgresql,Ruby On Rails,Ruby,Postgresql,很好,我正在尝试创建一个范围,通过关联模型的属性以及模型本身的属性来搜索关联模型的记录 class Payment < ApplicationRecord belongs_to :payment_issuer, class_name: 'Balance', foreign_key: 'payment_issuer_id', optional: true belongs_to :payment_reciever, class_name: 'Balance', foreign_key:
class Payment < ApplicationRecord
belongs_to :payment_issuer, class_name: 'Balance', foreign_key: 'payment_issuer_id', optional: true
belongs_to :payment_reciever, class_name: 'Balance', foreign_key: 'payment_reciever_id'
belongs_to :closure, optional: true
validates_presence_of :amount, :reference, :status
scope :for_commerce, -> (commerce) { Payment.joins(payment_reciever: {user: :commerce}).where(
payment_recievers: {
users: {
commerce: commerce
}
}
)
}
scope :billed_at, -> (date) { where("payments.status ILIKE 'Pago' AND payments.created_at >=?", date) }
scope :refills, -> { where("payments.status ILIKE 'Recarga'") }
end
但是不要返回任何记录,即使我输入了精确的值
这是回报
Payment Load (3.3ms) SELECT "payments".* FROM "payments" INNER JOIN "balances" ON "balances"."id" = "payments"."payment_issuer_id" INNER JOIN "users" ON "users"."id" = "balances"."user_id" WHERE "users"."name" = $1 AND "payments"."reference" = $2 LIMIT $3 [["name", "1605895669"], ["reference", "1605895669"], ["LIMIT", 11]]
我也试过了
scope :search, -> (search) { Payment.joins(payment_issuer: :user).where("payments.reference ILIKE '#{search}' OR payments.payment_issuers.users.name ILIKE '#{search}'") }
但是回来
ActiveRecord::StatementInvalid (PG::FeatureNotSupported: ERROR: cross-database references are not implemented: payments.payment_issuers.users.name)
LINE 1: ...E (payments.reference ILIKE 'Esteban Chirinos' OR payments.p...
非常感谢您,我希望您的回答有误吗?如果是,请将其添加到您的问题中。我认为您的
where
语句不正确,但如果没有这些信息,很难确定。即使输入值,也不会返回任何记录这已经存在了为什么你要做用户。我喜欢“管理员”
?规范化您的数据…@max向我解释如何规范化我的数据payments.payment\u issuers.users.name
应该是users.name
在您的查询中,现在它认为您正在调用[database\u name].[schema].[table].[column],这是跨数据库查询的正常格式。相反,您只需要[table].[column],因为联接处理对payments表和payment_issuers表的引用
Payment Load (3.3ms) SELECT "payments".* FROM "payments" INNER JOIN "balances" ON "balances"."id" = "payments"."payment_issuer_id" INNER JOIN "users" ON "users"."id" = "balances"."user_id" WHERE "users"."name" = $1 AND "payments"."reference" = $2 LIMIT $3 [["name", "1605895669"], ["reference", "1605895669"], ["LIMIT", 11]]
scope :search, -> (search) { Payment.joins(payment_issuer: :user).where("payments.reference ILIKE '#{search}' OR payments.payment_issuers.users.name ILIKE '#{search}'") }
ActiveRecord::StatementInvalid (PG::FeatureNotSupported: ERROR: cross-database references are not implemented: payments.payment_issuers.users.name)
LINE 1: ...E (payments.reference ILIKE 'Esteban Chirinos' OR payments.p...