我希望在这里得到一些帮助。我在Rails 3.2的许多领域都是一个菜鸟,但我的情况要好得多。
我有一个已经检索到正确记录的集合选择。我有多个属性,然后有多个用户。集合选择正确使用UserProperty表仅过滤属性用户(我希望collect显示与该属性相关的每个用户)。所以我有用户名而不是名字。
所以我尝试通过查询父表(用户)来提取父对象属性并通过来创建对象。不幸的是,第二个查询只传递一条记录。所以废弃了。
最简单的方法是使用collection_select中的第一个查询,然后根据引用用户ID显示父字段。是否有语法允许我将文本显示回集合选择和查询对象“池”中的父(USER)表?
目标是通过嵌套路由(@property) - 工作来查询UserProperties。 (@pool包含正确的结果)
然后显示User的名称字段。 (User.name)
这是我的代码:
控制器:
def find_property
@property = Property.find(params[:property_id])
@pool = UserProperty.find_all_by_property_id(@property)
end
查看:
<%= fields_for (:assigned_to_user_id) do |pool| %>
<%= pool.collection_select(:assigned_to_user_id, @pool, :id, :id ) %>
<!-- Need to change last field from id to name field of Users Table -->
模型设计:(需要用户名称)
# Table name: users
#
# id :integer not null, primary key
# name :string(255)
# email :string(255)
class User < ActiveRecord::Base
attr_accessible :name, :email
has_many :properties, through: :user_properties
end
# Table name: user_properties
#
# id :integer not null, primary key
# user_id :integer
# property_id :integer
class UserProperty < ActiveRecord::Base
attr_accessible :property_id, :user_id
belongs_to :user
belongs_to :property
end
答案 0 :(得分:1)
问题已解决。 Rails内置了基于嵌套路由的过滤器。 所以朋友帮我解决了这个问题,使用了一种简单的方法,并按照RoyTheBoy的建议。
虽然有很多关系,但只需要有很多陈述。
模型如下:
has_many :users, through: :user_properties
has_many :user_properties (new line)
然后从@pool
中删除过滤器 @pool = @property.users.all (rails automagically pulls from the nested route)
FYI - 用于加载嵌套属性的现有before_filter
@property = Property.find(params[:property_id])
这允许更简单的collection_select
<%= fields_for (:assigned_to_user_id) do |pool| %>
<%= collection_select(:assigned_to_user_id, :user_id, @pool , :id, :name, prompt: true) %>
属性的嵌套路由,自动处理过滤!要爱上铁轨,特别是喜欢我的新手! 感谢罗伯特的帮助!
答案 1 :(得分:0)
来自您的表格定义,您需要的模型
class UserPropery < ActiveRecord::Base
belongs_to :user
class User < ActiveRecord::Base
has_many :user_properties
然后你可以使用
UserProperty.where(...).user.name
但是你说
“我有多个属性,然后有多个用户。”
这对我来说意味着一个属性可以有很多用户,在这种情况下,你的User表和你的模型中应该有一个user_propery_id字段
class UserPropery < ActiveRecord::Base
has_many :user
class User < ActiveRecord::Base
belongs_to :user_properties
然后你可以使用像
这样的东西UserProperty.where(...).users.collect {|user| [ user.id, user.name ]}
这是协会如何运作的一个很好的解释 http://guides.rubyonrails.org/association_basics.html