如何通过Rails中的融合关联列出和排列相关记录?

时间:2012-04-13 04:55:50

标签: ruby-on-rails

请原谅铁路禁区问题。我正在尝试显示相关记录的列表,但是我正在努力处理相反方向的关联。

例如,我有

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)",这似乎更合适。但就这两种方法与数据库的交互方式而言,这两种方法有何区别?

1 个答案:

答案 0 :(得分: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

<强> UPD:

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

User.where(id: @country.events.uniq.pluck(:user_id))