这个多态关联有什么问题?
What is wrong with this polymorphic association?
我有
class User::AuthInfo < ActiveRecord::Base
self.table_name = "auth_infos"
belongs_to :authenticable, polymorphic: true
end
和
class User::Customer < ActiveRecord::Base
self.table_name = "customers"
has_one :auth_info, as: :authenticable
end
我希望这样做:
User::Customer.last.auth_info
输出应该是来自 auth_info
的记录。但是我看到查询是错误的:
SELECT `auth_infos`.* FROM `auth_infos` WHERE `auth_infos`.`customer_id` = 8 LIMIT 1
我的 table 有 authenticable_id
和 authenticable_type,
文档告诉我创建以使多态工作的字段。
怎么了?为什么使用 customer_id
而不是 authenticable_id
?
编辑:
这里是两个 table 的架构:
编辑:
我确实省略了一件事,因为我认为它不重要,但它似乎导致了问题,在我使用的 Customer 模型上有一个问题:
include User::Loggable
关注内容如下:
module User::Loggable
extend ActiveSupport::Concern
included do
has_one :auth_info
end
def login ip_address
@session_ip = ip_address
create_session_token
self.save
end
def renew_session
@session_token_expire = renew_session
end
def destroy_session
self.session_token = nil
self.session_token_expire = nil
self.save
end
def verify_session! (token, ip)
if (ip == session_ip && token = session_token && session_token_expire.to_i > Time.now.to_i)
true
else
false
end
end
private
def new_token( string = "" )
...
end
def digest_token token
..
end
def register_user
a = User.new email_address: self.email_address, kind: self.class.name
a.save
end
def create_session_token
@session_token = digest_token(new_token())
@session_token_expire = (Time.now + AUTHENTICATION[::Rails.env]["expiration"]["session"].hour.to_i).strftime("%Y-%m-%d %H:%M:%S")
end
def renew_session
session_token_expire = (Time.now + AUTHENTICATION[::Rails.env]["expiration"]["session"] + 3.hour).strftime("%Y-%m-%d %H:%M:%S")
end
module ClassMethods
def authenticated_account
current_account ||= self.find_by_session_token() if CbsoltCore::App::Environment.account_session_token && CbsoltCore::App::Environment.account_session_token != ""
# mettere parte API token
current_account
end
end
end
我已经推荐了我的模块中的 include for concern,它有效。为什么?
您担心的是覆盖客户模型中的关联。
included do
has_one :auth_info, as: :authenticable
end
在关注点或真实模型中提供多态关联。
我有
class User::AuthInfo < ActiveRecord::Base
self.table_name = "auth_infos"
belongs_to :authenticable, polymorphic: true
end
和
class User::Customer < ActiveRecord::Base
self.table_name = "customers"
has_one :auth_info, as: :authenticable
end
我希望这样做:
User::Customer.last.auth_info
输出应该是来自 auth_info
的记录。但是我看到查询是错误的:
SELECT `auth_infos`.* FROM `auth_infos` WHERE `auth_infos`.`customer_id` = 8 LIMIT 1
我的 table 有 authenticable_id
和 authenticable_type,
文档告诉我创建以使多态工作的字段。
怎么了?为什么使用 customer_id
而不是 authenticable_id
?
编辑:
这里是两个 table 的架构:
编辑:
我确实省略了一件事,因为我认为它不重要,但它似乎导致了问题,在我使用的 Customer 模型上有一个问题:
include User::Loggable
关注内容如下:
module User::Loggable
extend ActiveSupport::Concern
included do
has_one :auth_info
end
def login ip_address
@session_ip = ip_address
create_session_token
self.save
end
def renew_session
@session_token_expire = renew_session
end
def destroy_session
self.session_token = nil
self.session_token_expire = nil
self.save
end
def verify_session! (token, ip)
if (ip == session_ip && token = session_token && session_token_expire.to_i > Time.now.to_i)
true
else
false
end
end
private
def new_token( string = "" )
...
end
def digest_token token
..
end
def register_user
a = User.new email_address: self.email_address, kind: self.class.name
a.save
end
def create_session_token
@session_token = digest_token(new_token())
@session_token_expire = (Time.now + AUTHENTICATION[::Rails.env]["expiration"]["session"].hour.to_i).strftime("%Y-%m-%d %H:%M:%S")
end
def renew_session
session_token_expire = (Time.now + AUTHENTICATION[::Rails.env]["expiration"]["session"] + 3.hour).strftime("%Y-%m-%d %H:%M:%S")
end
module ClassMethods
def authenticated_account
current_account ||= self.find_by_session_token() if CbsoltCore::App::Environment.account_session_token && CbsoltCore::App::Environment.account_session_token != ""
# mettere parte API token
current_account
end
end
end
我已经推荐了我的模块中的 include for concern,它有效。为什么?
您担心的是覆盖客户模型中的关联。
included do
has_one :auth_info, as: :authenticable
end
在关注点或真实模型中提供多态关联。