如何解决Ecto:如何访问预加载关联的字段
我正在尝试获取与 friend_referral_code 没有关联的用户,或者他们的代码状态为 false 并且他们也没有使用任何代码。但是我无法访问预加载关联friend_referral_code 的字段status。这是我如何做到的:
def get_first_free_invite_users() do
users =
list_users()
|> Repo.preload([:friend_referral_code])
|> Enum.filter(
fn u ->
u.friend_referral_code == [] or u.friend_referral_code["status"] == false and
Repo.all(from ref in FriendReferralCode,where: ref.receiver_id == ^u.id and ref.status == true) == []
end)
users
end
它在 u.friend_referral_code.status == false
上抛出错误。我不能加入的原因是 FriendReferralCode 中可能没有特定用户的记录,我想捕获这些用户。这是关联的加载方式:
friend_referral_code: [
%MyApp.Accounts.FriendReferralCode{
__Meta__: #Ecto.Schema.Metadata<:loaded,"friend_referral_code">,challenge: #Ecto.Association.NotLoaded<association :challenge is not loaded>,challenge_id: nil,code: "RFQTS",expiry: 1,id: 16021,inserted_at: ~N[2021-02-01 11:55:00],order: 1,prize: #Decimal<3>,receiver: #Ecto.Association.NotLoaded<association :receiver is not loaded>,receiver_id: 15002,state: "create_competition",status: false,updated_at: ~N[2021-02-01 11:57:20],user: #Ecto.Association.NotLoaded<association :user is not loaded>,user_id: 15001
}
],
解决方法
它在 u.friend_referral_code.status == false 上抛出错误。
那是因为 u.friend_referral_code
在您的示例中是一个列表。您需要枚举 u.friend_referral_code
并检查每个的状态。
试试这样的方法。
def get_ref_codes_by_user(id) do
Repo.all(from ref in FriendReferralCode,where: ref.receiver_id == ^u.id and ref.status == true)
end
def filter_referrals([],user_id,acc),do: acc
def filter_referrals([ref,rest],acc) do
is_used =
ref == [] || ref.status == false && get_ref_codes_by_user(id) == []
new_acc =
case is_used do
true -> acc
false -> [ref | acc]
end
filter_referrals(rest,new_acc)
end
def get_first_free_invite_users() do
list_users()
|> Repo.preload([:friend_referral_code])
|> Enum.map(
fn u ->
filter_referrals(u.friend_referral_code,u.id,[])
end)
end
这将使您更接近,并为您提供一个 FriendReferralCode
列表。仔细检查这里的逻辑是否是您想要的。综上所述,您应该能够通过加入来做到这一点。检查文档 here 和其他关于连接类型的 SO answer。
试试
Repo.all(from ref in FriendReferralCode,right_join users u on ref.user_id = u.id
where: ref.status == true)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。