0

请原谅铁路菜鸟的问题。我正在尝试显示关联记录的列表,但在处理相反方向的关联时遇到了麻烦。

例如,我有

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)",到目前为止似乎更合适。但是,就它们与数据库交互的方式而言,这两种方法有什么区别呢?

4

1 回答 1

3

使用:through选项:has_many来快速访问您的深度关联记录:

Country
  has_many :states
  has_many :cities, through: :states # <-
  has_many :events, through: :cities # <-
  has_many :users, through: :events # <-
end

State
  belongs_to :country
  has_many :cities
  has_many :events, through: :cities # <-
  has_many :users, through: :events # <-
end

City
  belongs_to :state
  has_many :events
  has_many :users, through: :events # <-
end

您可以简单地键入:@country.users.

升级版:

要获取国家/地区事件的所有用户,请尝试:

User.where(id: @country.events.uniq.pluck(:user_id))
于 2012-04-13T05:44:14.883 回答