Collection_select - 在子查询中显示父字段数据的语法

时间:2014-01-16 07:19:57

标签: ruby-on-rails ruby-on-rails-3.2 parent-child grouped-collection-select

我希望在这里得到一些帮助。我在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

2 个答案:

答案 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