jsonapi::Serializer 在关联中指定外键 belongs_to / has_many
jsonapi::Serializer Specify Foreign Key in Association belongs_to / has_many
我有一个无法修改的数据库,因为它是从我无法控制的节点填充的只读数据库。
这会导致表格 foreign_keys
不同于 Rails 默认方式。
您可以在以下模型中查看当前情况:
# app/models/epoch_stake.rb
class EpochStake < DbSyncRecord
self.table_name = 'epoch_stake'
belongs_to :stake_address, foreign_key: :addr_id
end
# app/models/stake_address.rb
class StakeAddress < DbSyncRecord
self.table_name = "stake_address"
has_many :epoch_stakes, foreign_key: :addr_id
end
addr_id
rather than stake_address_id
现在我正在创建一个控制器来获取其中一个模型,使用序列化程序来显示关联的模型。
class EpochStakeController < ApplicationController
def index
epoch_stakes = EpochStake.all
render json: EpochStakeSerializer.new(epoch_stakes)
end
end
似乎当我试图告诉 JSONAPI::Serializer
要注意不同的 foreign_key
时,似乎没有考虑到:
# app/serializers/epoch_stake_serializers.rb
class EpochStakeSerializer
include JSONAPI::Serializer
attributes :epoch_no, :amount
belongs_to :stake_address, foreign_key: :addr_id
end
事实上,当我使用上面的配置查询控制器 (/epoch_stakes
) 时,我收到以下错误,好像序列化程序正在尝试寻找与 Rails 默认 [=21] 的关联=] 而不是我在序列化程序中指定的那个:
NoMethodError: undefined method `stake_address_id' for #<EpochStake:0x00007fcf9f22ad50>
Did you mean? stake_address
stake_address=
from /Users/sergio/.rvm/gems/ruby-2.6.1/gems/activemodel-6.1.3/lib/active_model/attribute_methods.rb:469:in `method_missing'
如何让序列化程序知道不同的 foreign_key
?
您应该使用 id_method_name
选项:
# app/serializers/epoch_stake_serializers.rb
class EpochStakeSerializer
include JSONAPI::Serializer
attributes :epoch_no, :amount
belongs_to :stake_address, id_method_name: :addr_id
end
查看文档:https://github.com/jsonapi-serializer/jsonapi-serializer#customizable-options
我有一个无法修改的数据库,因为它是从我无法控制的节点填充的只读数据库。
这会导致表格 foreign_keys
不同于 Rails 默认方式。
您可以在以下模型中查看当前情况:
# app/models/epoch_stake.rb
class EpochStake < DbSyncRecord
self.table_name = 'epoch_stake'
belongs_to :stake_address, foreign_key: :addr_id
end
# app/models/stake_address.rb
class StakeAddress < DbSyncRecord
self.table_name = "stake_address"
has_many :epoch_stakes, foreign_key: :addr_id
end
addr_id
rather thanstake_address_id
现在我正在创建一个控制器来获取其中一个模型,使用序列化程序来显示关联的模型。
class EpochStakeController < ApplicationController
def index
epoch_stakes = EpochStake.all
render json: EpochStakeSerializer.new(epoch_stakes)
end
end
似乎当我试图告诉 JSONAPI::Serializer
要注意不同的 foreign_key
时,似乎没有考虑到:
# app/serializers/epoch_stake_serializers.rb
class EpochStakeSerializer
include JSONAPI::Serializer
attributes :epoch_no, :amount
belongs_to :stake_address, foreign_key: :addr_id
end
事实上,当我使用上面的配置查询控制器 (/epoch_stakes
) 时,我收到以下错误,好像序列化程序正在尝试寻找与 Rails 默认 [=21] 的关联=] 而不是我在序列化程序中指定的那个:
NoMethodError: undefined method `stake_address_id' for #<EpochStake:0x00007fcf9f22ad50>
Did you mean? stake_address
stake_address=
from /Users/sergio/.rvm/gems/ruby-2.6.1/gems/activemodel-6.1.3/lib/active_model/attribute_methods.rb:469:in `method_missing'
如何让序列化程序知道不同的 foreign_key
?
您应该使用 id_method_name
选项:
# app/serializers/epoch_stake_serializers.rb
class EpochStakeSerializer
include JSONAPI::Serializer
attributes :epoch_no, :amount
belongs_to :stake_address, id_method_name: :addr_id
end
查看文档:https://github.com/jsonapi-serializer/jsonapi-serializer#customizable-options