ruby-on-rails – 如何使用has_one关联连接关联表

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 如何使用has_one关联连接关联表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的Rails应用程序中,我只要求用户注册时输入电子邮件和姓名,然后为他们提供选项,以便为他们的个人资料提供更全面的联系详细信息.因此,我有一个User.rb模型,它与Contact.rb有关联,即

User.rb

  1. has_one :contact

Contact.rb

  1. belongs_to :user

Contact.rb具有您可能期望的可预测字段,例如地址,邮政编码等,但它也存储了省份与省份.rb模型的关系,所以

Contact.rb

  1. attr_accessible :address,:city,:mobile,:postalcode,:province_id,:user_id
  2. belongs_to :user
  3. belongs_to :province

Province.rb

  1. has_many :contacts

我这样做(而不是将省名称作为“字符串”存储在contact.rb上),这样我就可以更轻松地(所以我认为)按省份对用户进行分类.

在其中一个artists_controller的show动作中,我执行以下操作来检查用户是否尝试按省排序,然后调用一个执行搜索的artists_by_province方法

  1. if params[:province_id]
  2. province = params[:province_id]
  3. province = province.to_i #convert string to integer
  4.  
  5. @artistsbyprovince = User.artists_by_province(province)
  6.  
  7. else
  8.  
  9. @artists = User.where(:sculptor => true)
  10.  
  11. end

这是User.rb模型上的方法,如果传入省id,它将调用方法

  1. scope :artists_by_province,lambda {|province|
  2. joins(:contact).
  3. where( contact: {province_id: province},users: {sculptor: true})
  4.  
  5. }

但它给了我这个错误

  1. Could not find table 'contact'

如果我联系复数

  1. scope :artists_by_province,lambda {|province|
  2. joins(:contacts).
  3. where( contacts: {province_id: province},users: {sculptor: true})
  4.  
  5. }

这个错误

  1. Association named 'contacts' was not found; perhaps you misspelled it?

当我进行此查询时,有人能告诉我我做错了什么吗?

更新:我发布后更改了一些细节因为我的复制和粘贴有一些问题

附:忽略我正在寻找’雕塑家’的事实.我更改了问题的用户类型的名称.

来自schema.rb

  1. create_table "contacts",:force => true do |t|
  2. t.string "firm"
  3. t.string "address"
  4. t.string "city"
  5. t.string "postalcode"
  6. t.string "mobile"
  7. t.string "office"
  8. t.integer "user_id"
  9. t.datetime "created_at",:null => false
  10. t.datetime "updated_at",:null => false
  11. t.integer "province_id"
  12. end

解决方法

通过在联接中使用联系人(单数)和在where子句中使用联系人(复数)来解决问题.我猜测’contact'(单数)反映了User.rb和Contact.rb之间的has_one关联,而’contacts’在where子句中用于表示表的名称,该表始终为复数.

User.rb

  1. has_one :contact
  2.  
  3. scope :artists_by_province,lambda {|province|
  4. joins(:contact).
  5. where( contacts: {province_id: province},users: {sculptor: true})
  6.  
  7. }

猜你在找的Ruby相关文章