Ruby on rails 如何在.find上使用hash:condition作为nil?Rails中的方法(有一个关系)

Ruby on rails 如何在.find上使用hash:condition作为nil?Rails中的方法(有一个关系),ruby-on-rails,find,null,Ruby On Rails,Find,Null,我想查找其:has_one relationship to:contact_status的值没有值的所有联系人(这是否意味着nil?) 我创建了一个alias\u属性:status,:status\u contact 我可以按照以下思路做些事情吗: contacts = Contact.find(:all, :conditions => {:contact_status => nil }, :include => {:status_contact} ) 我不确定nil到底是怎

我想查找其:has_one relationship to:contact_status的值没有值的所有联系人(这是否意味着nil?)

我创建了一个
alias\u属性:status,:status\u contact

我可以按照以下思路做些事情吗:

contacts = Contact.find(:all, :conditions => {:contact_status => nil }, :include => {:status_contact} )
我不确定nil到底是怎么工作的。基本上,我没有给它赋值,它只是一个:has_one关系

编辑:听起来联系人应该是属于关系的,所以要进行更改 从评论中,听起来联系人实际上应该与状态联系人有归属关系,而状态联系人又与联系人“有一个”

我正在使用Searchlogic创建命名的_作用域……我认为它解决了这个问题,有人熟悉吗

但是,有时用户可以为其指定一个值。我不想让那些东西被发现

当前获取此错误:

SQLite3::SQLException:near.'':语法错误:选择“contacts”。“id”作为t0_r0,“contacts”。“first_name”作为 t0_r1,“联系人”,“姓氏”为t0_r2,“联系人”,“头衔”为t0_r3,“联系人”,“电话”为t0_r4,“联系人” “传真”为t0_r5,“联系人”。“电子邮件”为t0_r6,“联系人”。“公司”为t0_r7,“联系人”。“创建于”为t0_r6 _r8,“联系人”。“更新地址”为t0\U r9,“联系人”。“活动id”为t0\U r10,“联系人”。“输入日期”为t0_ r11,“联系人”,“公司id”为t0_r12,“联系人”,“地址id”为t0_r13,“联系人”,“vcard_文件名”为 t0_r14,“联系人”,“vcard_内容类型”为t0_r15,“联系人”,“vcard_文件大小”为t0_r16,“联系人”,“vcar” d_将_更新为“AS t0_r17”,联系人。“direct”更新为t0_r18,联系人。“sugarcrm”更新为t0_r19,联系人状态。 “id”为t1_r0,“状态_触点”,“状态”为t1_r1,“状态_触点”,“触点id”为t1_r2,“状态_触点” ts.“创建位置”为t1\U r3,“状态\U联系人”。“更新位置”为t1\U r4,从“联系人”左侧外部连接“状态 _contacts“ON status\u contacts.contact\u id=contacts.id,其中(:status\u contact.status=NULL)

试试看

contacts = Contact.find(:all, :conditions => "status_contact_id IS NULL")
假设您的fk列为contacts.status\u contact\u id

更新:nathanvda是正确的;此外,我认为您可以不必通过sql查找就可以做到这一点-未经测试


注意:我仍然认为您真的想使用Contact-with-belowns\u-to:status\u-Contact

取决于Rails的版本,我主要在2.3.5中工作,但我相信在这种情况下,“条件”应该是“类似SQL的片段”

通常你会这样做

contacts = Contact.find(:all, :include => :contact_status, :conditions => ["contact_status.status = ?", nil])
:conditions => ['status = ?', nil]
contacts = Contact.find(:all, :conditions => "status_contact_id IS NULL")
select * from contacts where id not in (select contact_id from status_contacts)

另外,Ruby中的
nil
表示完全没有价值。它不储存任何东西。[]是一个空数组,如果您向它发送消息
nil?
,它将返回false,但它将对消息
empty?
响应true。

您的错误与您显示的代码不符。 我猜你在做类似的事情

contacts = Contact.find(:all, :include => :contact_status, :conditions => ["contact_status.status = ?", nil])
:conditions => ['status = ?', nil]
contacts = Contact.find(:all, :conditions => "status_contact_id IS NULL")
select * from contacts where id not in (select contact_id from status_contacts)
但是您应该检查的不是
状态
,它是链接对象。这是在ruby代码中检查它的方式,而不是在sql中

在您的表中,有一个名为
status\u contact\u id
的字段,当该字段为
NULL
(相当于
nil
)时,它就没有关系了

所以你确实需要做一些类似的事情

contacts = Contact.find(:all, :include => :contact_status, :conditions => ["contact_status.status = ?", nil])
:conditions => ['status = ?', nil]
contacts = Contact.find(:all, :conditions => "status_contact_id IS NULL")
select * from contacts where id not in (select contact_id from status_contacts)
[编辑]由于您使用的是
具有一个
关系,请仔细阅读,外键确实在
状态_contacts
表中定义。但是,查询没有任何状态联系人的项目会变得更加复杂

在sql中,您可以执行以下操作

contacts = Contact.find(:all, :include => :contact_status, :conditions => ["contact_status.status = ?", nil])
:conditions => ['status = ?', nil]
contacts = Contact.find(:all, :conditions => "status_contact_id IS NULL")
select * from contacts where id not in (select contact_id from status_contacts)
我会这样把它翻译成ruby:

contacts = Contacts.find_by_sql("select * from contacts where id not in (select contact_id from status_contacts)"

就我个人而言,我现在想不出更好的办法

我使用的是2.3.5…这个“散列”版本的工作原理和我输入的类似吗?散列将用于指定字段及其值,我不确定它是否适用于别名。虽然我无法想象为什么它不会。它知道,因为有一个联系人加入了联系人状态。联系人id?
[“contact\u status.status=?”,nil]
转换为
联系人状态=NULL
,这总是错误的,因为在SQL.Hmmm中NULL=NULL=>错误……也许我把它颠倒了。我没有身份证\u联系人\u id。。。我的状态\u联系人表确实有联系人id。。。。它似乎在工作……联系人有一个状态联系人——这是否意味着有外键的联系人有外键?我从status_contact中遥控了外键?这是我发现的,听起来属于的应该有外键?哎呀,一个
有一个
关系!我更新了我的答案来反映这个选项。嗨,有外键的记录不应该有外键吗?是的,您是正确的,在查看您的sql错误后,我现在可以看到模式了-我最初的想法是has_one不是用于此案例的理想关系;除非每个联系人都有一个唯一的状态联系人,我怀疑这是不是真的。不,它不是唯一的……所以应该是相反的,联系人属于状态联系人?我“认为”联系人属于状态联系人在这种情况下会更好吗?