获取基于其他表的记录

时间:2017-05-10 14:29:13

标签: ruby-on-rails ruby activerecord

我对Ruby很新,并且不知道这样做。我需要根据2个表创建一个选择:A和B.两者都是ActiveRecord。

public enum City implements BaseEnumInterface {

    TOKYO(0), NEWYORK(1);

    private final int key;

    public static Set<Integer> fromValue(Set<City> enums) {
        return enums.stream().map(City::getKey).collect(Collectors.toSet());
    }

    public int getKey() {
        return key;
    }

    private City(int key) {
        this.key = key;
    }
}


public enum Country implements BaseEnumInterface {

    USA(0), UK(1);

    private final int key;

    public static Set<Integer> fromSet(Set<Country> enums) {
        return enums.stream().map(Country::getKey).collect(Collectors.toSet());
    }

    public int getKey() {
        return key;
    }

    private Country(int key) {
        this.key = key;
    }

}


public class EnumUtility {

    public static <E extends Enum<E> & BaseEnumInterface> E fromKey(Class<E> enumClass, Integer key) {
        for (E type : enumClass.getEnumConstants()) {
            if (key == type.getKey()) {
                return type;
            }
        }
        throw new IllegalArgumentException("Invalid enum type supplied");
    }

    public static <E extends Enum<E> & BaseEnumInterface> Set<Integer> fromSet(Class<E> enumClass, Set<E> enums) {
        return enums.stream().map(BaseEnumInterface::getKey).collect(Collectors.toSet());
    }   
}


interface BaseEnumInterface {

    int getKey();

}


public class EnumTester {

    public static void main(String args[]) {
        System.out.println(EnumUtility.fromKey(Country.class, 1));
    }
}

class A < ActiveRecord::Base belongs_to :b end class B < ActiveRecord::Base has_one :a end 条记录没有关联A条记录。我想得到这些问题的记录。

4 个答案:

答案 0 :(得分:4)

另一种选择是使用includes

A.includes(:b).where(bs: { id: nil })

它将对数据库进行单一查询。

答案 1 :(得分:3)

您可以使用与以下内容关联的B记录检索A记录:

A.joins(:B)

如果您需要所有与B没有关联的A记录,您可以执行:

A.where(B: nil)

答案 2 :(得分:2)

嗯......你可以做点什么,

unassociated_ids = A.pluck(:id) - B.pluck(:a_id).uniq
A.where(id: unassociated_ids)

希望有所帮助......

答案 3 :(得分:2)

在Rails中,belongs_to关联意味着表a有一个名为b_id的字段。这意味着A表可以直接访问它与B的关联。

要获取没有A附加B的{​​{1}}条记录,请运行A.where(b_id: nil),这将返回所有A条记录的数组,而不包含B

编辑:正如coorasse所述,您也可以运行A.where(b: nil),Rails将其解释为A.where(b_id: nil)