首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关联:uniq => true并不总是返回唯一的结果。

关联:uniq => true并不总是返回唯一的结果。
EN

Stack Overflow用户
提问于 2010-01-26 16:35:20
回答 1查看 1.7K关注 0票数 2

我有一组与地理相关的课程:州,Msa,县,城市等等。这些类都是从一个基址类上来的。这些类在很大程度上是通过一个称为地理的非规范化连接表来关联的。所以我有..。

代码语言:javascript
复制
class Geography < ActiveRecord::Base
  belongs_to :state
  belongs_to :county
  belongs_to :city
  # ... etc.
end

class Location < ActiveRecord::Base
end

class State < Location
  has_many :geographies
  has_many :msas, :through => :geographies, :uniq => true
  # ... etc.
end

class Msa < Location
  has_many :geographies
  has_many :states, :through => :geographies, :uniq => true
  # ... etc.
end

现在,当我从控制台运行以下内容时:

代码语言:javascript
复制
>> msas = Msa.find(:all, :include=>"states", :conditions=>{"states_locations"=>{"id"=>"1"}})

我得到了正确的结果数(本例中为13)。但是,运行这个find调用产生的SQL,我得到了1,00个结果(同样,地理表是一个数据类型,这就是为什么我在关联中使用:uniq选项的原因)。

代码语言:javascript
复制
SELECT          `locations`.`id` AS t0_r0, 
                `locations`.`parent_id` AS t0_r1, 
                `locations`.`type` AS t0_r2, 
                `locations`.`name` AS t0_r3, 
                `states_locations`.`id` AS t1_r0, 
                `states_locations`.`parent_id` AS t1_r1, 
                `states_locations`.`type` AS t1_r2, 
                `states_locations`.`name` AS t1_r3
FROM            `locations` 
LEFT OUTER JOIN `geography` 
ON              `locations`.`id` = `geography`.`msa_id`
LEFT OUTER JOIN `locations` states_locations 
ON              `states_locations`.`id` = `geography`.`state_id`
AND             `states_locations`.`type` = 'State'
WHERE           `states_locations`.`id` = '1'
AND             `locations`.`type` = 'Msa' 

我假设这意味着Rails正在将1,000多个记录加载到内存中,然后,在Ruby中,将结果减少到不同的Msas集合(在本例中);看起来有点低效。此外,以下后续调用返回不同的结果:

代码语言:javascript
复制
>> msas.first.states.size    # incorrect count
=> 192
>> msas.first.states.count   # correct count
=> 1 
>> msas.first.states         # incorrect number of State objects
=> [#<State id: 1, ... >, ..., #<State id: 1, ... >]
>> msas.first.reload.states
=> [#<State id: 1, ... >]    # correct number of State objects

我的问题是:

  1. 为什么Rails在从find调用产生的查询中没有使用不同的?我猜这是因为我要求它:包括=> :states。我应该使用:联接吗?
  2. 为什么Rails在调用msas.first.states时返回非唯一的结果?具有a :uniq =>真值的关联难道不应该对结果强制执行唯一性吗?
  3. 为什么我需要使用Rails为locations表的状态“版本”使用的表别名,即:=> { :states_locations => { :id => 1 }}?Rails似乎不理解:包括=> :states,:conditions => { :states => { :id => 1 }}。是否有确定地预测表别名的方法?

任何见解都将不胜感激。

谢谢你,杰森

EN

回答 1

Stack Overflow用户

发布于 2010-01-26 17:53:25

你有很多问题,让我看看能不能帮上忙.

rails将触发一个sql调用以获得所有结果,这是正确的,然后active_record应该筛选出唯一的记录。

如果要避免这种情况,可以执行以下操作:

has_many :states, :through => :geographies, :select => "DISTINCT states.*"

这个帖子有有趣的分析

还有你的台词:

msas = Msa.find(:all, :include=>"states", :conditions=>{"states_locations"=>{"id"=>"1"}})

它没有返回唯一的结果,因为您没有利用您所建立的关系。你可能想做这样的事情:

@msas = State.find(state_id).msas

祝好运

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2140844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档