Rails:OR关联条件

时间:2016-01-11 09:22:55

标签: ruby-on-rails ruby-on-rails-4 activerecord rails-activerecord ruby-on-rails-4.2

我有一个名为Facility的模型。它has_many :addressesAddress模型has_one :city

现在我要运行一个条件:

  • 获取所有没有相关地址的设施;
  • 如果他们有地址,请检查他们是否没有与该地址相关联的城市模型。

我已尝试过第一个条件,但我无法将OR合并。

这会使所有没有与之关联的地址模型的设施

Facility.includes(:addresses).where( :addresses => {:facility_id => nil})

有些错误尝试是:

Facility.includes(:addresses).where( :addresses => ({:facility_id => nil}).or({:city_id => nil}) );
Facility.includes(:addresses).where( :addresses => ({:facility_id => nil}).or(:address => {:city_id => nil}) )

3 个答案:

答案 0 :(得分:2)

尝试以下方法:

Facility.includes(:addresses)
        .where('addresses.facility_id is null or addresses.city_id is null')
        .references(:addresses)

您还可以找到有趣的this post,关于activerecord查询中or条件的可能实现。

答案 1 :(得分:0)

试试这个

Facility.includes(addresses: :city).where("addresses.facility_id IS NULL OR addresses.city_id IS NULL");

希望这会有所帮助。

答案 2 :(得分:0)

首先,当您想对关联执行条件时使用includes会产生负面影响:

  • 您将渴望加载数据,如果不需要,则意味着无所事事要做
  • 急切加载的addresses仅与条件匹配的addresses。因此,如果您使用sql_no_address = Facility.assoc_not_exists_sql(:addresses) sql_no_city = Facility.assoc_exists_sql(:addresses) { where_assoc_not_exists(:city) } Facility.where("#{sql_no_address} OR #{sql_no_city}") ,则不会获得该记录的所有内容(只有那些符合条件的记录)。这会导致奇怪的错误或难以理解的工作代码。

为避免出现此问题以及所有其他问题,我建议使用为此专门制造的宝石:activerecord_where_assoc

您的问题可以简化,我会照原样答复您的请求,然后再这样做:

根据标签,您似乎正在使用Rails 4.2。因此,您还没有访问#or方法的权限。所以这就是你怎么做:

Facility.where_assoc_not_exists(:addresses).or(Facility.where_assoc_not_exists([:addresses, :city]))

如果您具有Rails 5或更高版本:

Facility.where_assoc_not_exists([:addresses, :city])

现在,一个更简单的解决方案。请注意,如果设施没有地址,那么它就不能有城市,因为它必须经过一个地址才能到达城市。确实,您的问题只是“我想要没有城市的设施”。这就是将数组传递给方法的作用,它尝试从一个数组移到另一个数组,直到最后。

ssh = paramiko.SSHClient()
# ...
ssh.connect(...)

sftp = ssh.open_sftp()

with sftp.open("/remote/path/my.log", "r") as f:
    for line in f:
        # process the line as you need
        print(line.rstrip())

这里是introductionexamples。在documentation中了解更多详细信息。