请原谅铁路禁区问题。我正在尝试显示相关记录的列表,但是我正在努力处理相反方向的关联。
例如,我有
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)"
,这似乎更合适。但就这两种方法与数据库的交互方式而言,这两种方法有何区别?
答案 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))