请原谅铁路菜鸟的问题。我正在尝试显示关联记录的列表,但在处理相反方向的关联时遇到了麻烦。
例如,我有
Country
has_many :states
has_many :users, :through => :events
has_many :venues, :through => :events
has_many :users
has_many :venues
end
State
belongs_to :country
has_many :cities
end
City
belongs_to :state
has_many :events
end
Event
belongs_to :city
belongs_to :user
belongs_to :venue
end
Venue
has_many :events
belongs_to :country
end
User
has_many :events
belongs_to :country
end
在国家展示视图中,我试图列出所有事件、所有场地和所有用户。
事件是直截了当的
@country = Country.find(params[:id])
@events = @country.states.cities.events.find(:all)
但我无法想象列出用户和场所的最佳方法。
要求是:
- 每个单独的用户/场地应列出一次,不得重复。
- 用户/场地应根据他们拥有的活动数量进行排序(针对当前国家,而不是总数)。
这似乎应该相当简单,但是在玩了 , 的各种排列之后,events.includes(:user)
我一直无法生成我需要的查询。.select("DISTINCT(ID)")
.order(user.events.length)
我想我可能陷入了这种思维定势。我真的很感谢社区的一些想法和想法,以确认我是否在正确的机架上。
谢谢!
编辑
在我多想之后,我认为我的问题来自于 Country 和 User 之间的两个关联,一个通过 Event 的关联,以及一个作为地址一部分的直接关联。我已经更新了上面的模型描述。
因此,在我的国家显示页面上,如何确保我列出通过事件而不是通过地址与国家相关联的用户?
我也得到了重复的用户。我尝试过使用.uniq?
,但在某些情况下会返回错误,'nil' is not an ActiveModel-compatible object that returns a valid partial path.
我也尝试过使用:select => "DISTINCT(ID)"
,到目前为止似乎更合适。但是,就它们与数据库交互的方式而言,这两种方法有什么区别呢?