当前位置 : 主页 > 编程语言 > ruby >

ruby-on-rails – 帮助HABTM:通过

来源:互联网 收集:自由互联 发布时间:2021-06-23
到目前为止,我目前的HABTM实现工作:has_and_belongs_to_many.通知和隐私都继承自Preference.偏好是STI.我想尝试使用:has_many,:通过关联代替. 模型文件 class User ActiveRecord::Base has_and_belongs_to_ma
到目前为止,我目前的HABTM实现工作:has_and_belongs_to_many.通知和隐私都继承自Preference.偏好是STI.我想尝试使用:has_many,:通过关联代替.

模型文件

class User < ActiveRecord::Base
  has_and_belongs_to_many :preferences
end

class Preference < ActiveRecord::Base
  has_and_belongs_to_many :users
end

class Notification < Preference
end

class Privacy < Preference
end

迁移文件

class UsersHaveAndBelongToManyPreferences < ActiveRecord::Migration
  def self.up
    create_table :preferences_users, :id => false do |t|
      t.references :preference, :user

      t.timestamps
    end
  end

  def self.down
    drop_table :preferences_users
  end
end

class CreatePreferences < ActiveRecord::Migration
  def self.up
    create_table :preferences do |t|
      t.string :title
      t.text :description
      t.string :type

      t.timestamps
    end
  end

  def self.down
    drop_table :preferences
  end
end

class DeviseCreateUsers < ActiveRecord::Migration
  def self.up
    create_table(:users) do |t|
      t.string :name
      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

我尝试了以下内容

class User < ActiveRecord::Base
  has_many :preferences, :through => :preferences_users
end

class Preference < ActiveRecord::Base
  has_many :users, :through => :preferences_users
end

我的表格看起来像

<% Preference.where(:type => 'Notification').all.each do |notification| %>
    <li>
      <%= check_box_tag 'user[preference_ids][]', notification.id, @user.preference_ids.blank? ? false : @user.preferences.include?(notification) %>
      <%= label_tag notification.description %>
    </li>
  <% end %>

我明白了

Could not find the association :preferences_users in model User

我究竟做错了什么?是我的形式还是我的协会中的问题?

好的,它得到了它的工作.我需要一个模型PreferencesUser,并且在用户和偏好模型上缺少has_many:preferences_users:

class PreferencesUser < ActiveRecord::Base
    belongs_to :user
    belongs_to :preference
end

class User < ActiveRecord::Base
  has_many :preferences_users
  has_many :preferences, :through => :preferences_users
end

class Preference < ActiveRecord::Base
  has_many :preferences_users
  has_many :users, :through => :preferences_users
end

没有必要改变我的形式.希望这有助于某人

网友评论