微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Ecto:如何访问预加载关联的字段

如何解决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 举报,一经查实,本站将立刻删除。