Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rails具有反向存储联接表ID的ANDBELONGTOMANY_Ruby On Rails_Ruby_Ruby On Rails 4_Has And Belongs To Many - Fatal编程技术网

Ruby on rails rails具有反向存储联接表ID的ANDBELONGTOMANY

Ruby on rails rails具有反向存储联接表ID的ANDBELONGTOMANY,ruby-on-rails,ruby,ruby-on-rails-4,has-and-belongs-to-many,Ruby On Rails,Ruby,Ruby On Rails 4,Has And Belongs To Many,我想使用连接两个表,这两个表拥有并属于多个。它们工作正常,但保存两列的ID会反向保存数据 i、 e.在选项_值和用户的联接表中,用户id保存在选项值列中,反之亦然。我的意思是,若用户id为2,选项_值为4,那个么在联接表中,在用户列,它将4和2存储在选项_值表中。这里是我曾经给过的简要描述。我知道它很大,请跟我来 user_decorator.rb module Spree User.class_eval do belongs_to :option_values has_and_b

我想使用
连接两个表,这两个表拥有并属于多个
。它们工作正常,但保存两列的ID会反向保存数据

i、 e.在选项_值和用户的联接表中,用户id保存在选项值列中,反之亦然。我的意思是,若用户id为2,选项_值为4,那个么在联接表中,在用户列,它将4和2存储在选项_值表中。这里是我曾经给过的简要描述。我知道它很大,请跟我来

user_decorator.rb
module Spree
 User.class_eval do
   belongs_to :option_values
   has_and_belongs_to_many :option_values, :uniq => true, :before_add => :validates_option_value,
  join_table: :spree_option_values_users,
  foreign_key: 'option_value_id',
  association_foreign_key: :user_id
   def validates_option_value(option_value)
     raise ActiveRecord::Rollback if self.option_values.include? option_value
   end
  end
 end
选项_decorator.rb

module Spree
  OptionValue.class_eval do
    belongs_to :user
    has_and_belongs_to_many :users, :uniq => true, :before_add => :validates_user,
  join_table: :spree_option_values_users,
  class_name: Spree.user_class.to_s,
  foreign_key: 'option_value_id',
  association_foreign_key: :user_id
    def validates_user(user)
      raise ActiveRecord::Rollback if self.users.include? user
    end
  end
end
迁移文件

class CreateJoinSpreeOptionValuesUsers < ActiveRecord::Migration
  def change
    create_table :spree_option_values_users do |t|
      t.integer :option_value_id
      t.integer :user_id
    end
  end
end
保存值

a = Spree::User.find(2)
b = Spree::OptionValue.find(4)
a.option_values << b
a.save
实际上,用户id为2,选项值id为4


提前感谢。

在两款车型中,您都有相同的
外键
关联外键
,也许这就是问题所在?@PablognonzálezAlba感谢您的帮助。我按照您的建议进行了更改,但值仍然放在错误的字段中。说。。用户id存储在选项值id列中,我的选项值id存储在用户id的位置。在两种型号中,您的
外键
关联外键
,也许这就是问题所在?@PablognonzálezAlba谢谢你的帮助。我按照您的建议进行了更改,但值仍然放在错误的字段中。说。。用户id存储在选项值id列中,我的选项值id存储在用户id的位置。在两种型号中,您的
外键
关联外键
,也许这就是问题所在?@PablognonzálezAlba谢谢你的帮助。我按照您的建议进行了更改,但值仍然放在错误的字段中。说。。用户id存储在option\u value\u id列中,而我的option\u value\u id存储在user\u id.TIA的位置
a = Spree::User.find(2)
b = Spree::OptionValue.find(4)
a.option_values << b
a.save
INSERT INTO `spree_option_values_users` (`option_value_id`, `user_id`) VALUES (?, ?)  [["option_value_id", 2], ["user_id", 4]]