Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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 3 我是哑巴还是铁轨虫?(绝望的;)_Ruby On Rails 3_Has And Belongs To Many - Fatal编程技术网

Ruby on rails 3 我是哑巴还是铁轨虫?(绝望的;)

Ruby on rails 3 我是哑巴还是铁轨虫?(绝望的;),ruby-on-rails-3,has-and-belongs-to-many,Ruby On Rails 3,Has And Belongs To Many,大家好, 我在habtm关系上遇到了一个奇怪的问题,老实说,我开始认为我可能在rails 3中偶然发现了一些奇怪的bug。当然我是疯了。我已经在这件事上苦思冥想了三天,在谷歌上搜索了所有我能想到的东西,但仍然找不到答案 好,情况是: 我正在创建一个Rails应用程序来替换Java应用程序和PHP应用程序(Java应用程序和PHP前端)。这将是一个分阶段的操作,第一阶段是Rails应用程序接管注册和计费。为了做到这一点,Rails应用程序必须在数据库中为Java和PHP应用程序创建数据。Rails

大家好,

我在habtm关系上遇到了一个奇怪的问题,老实说,我开始认为我可能在rails 3中偶然发现了一些奇怪的bug。当然我是疯了。我已经在这件事上苦思冥想了三天,在谷歌上搜索了所有我能想到的东西,但仍然找不到答案

好,情况是:

我正在创建一个Rails应用程序来替换Java应用程序和PHP应用程序(Java应用程序和PHP前端)。这将是一个分阶段的操作,第一阶段是Rails应用程序接管注册和计费。为了做到这一点,Rails应用程序必须在数据库中为Java和PHP应用程序创建数据。Rails应用程序本身正在使用Desive进行身份验证

在database.yml中,我定义了标准的3个数据库,还为Java应用程序数据库定义了一个连接

下面是外部对象的一些模型定义(我只是创建常规rails模型来与外部数据库通信):

class Pushbroom::UserAccount'pb_prod.users_roles',:class_name=>'Pushbroom::UserRole',:foreign_key=>'user_account_id',:association_foreign_key=>'user_role_id'
属于_to:user,:dependent=>:destroy
属性可访问:用户角色,:管理员注释,:已启用,:用户名,:密码\u哈希,:预存储,:已接受\u tos,:不联系
结束
类Pushbroom::UserRole'pb_prod.users_roles',:class_name=>'Pushbroom::UserAccount',:foreign_key=>'user_role_id',:association_foreign_key=>'user_account_id'
结束
最后是我的Rails应用程序用户对象:

class User < ActiveRecord::Base

  after_create :send_welcome_email
  before_save :create_pushbroom_user_data

  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  belongs_to :pb_user_account, :class_name => "Pushbroom::UserAccount", :foreign_key => "pb_user_account_id", :dependent => :destroy, :autosave => true

  # Setup accessible (or protected) attributes for your model
  attr_accessible :first_name, :last_name, :username, :dob, :email, :password,         :password_confirmation, :remember_me

  validates_presence_of :first_name, :last_name, :username, :dob
  validates_date :dob, :on_or_after => lambda { 100.years.ago }, :on_or_after_message => "must be on or after #{100.years.ago.strftime('%m-%d-%Y')}" 
  validates_date :dob, :on_or_before => lambda { 13.years.ago }, :on_or_before_message => "must be on or before #{13.years.ago.strftime('%m-%d-%Y')}"

  def create_pushbroom_user_data
    pb_user = create_pushbroom_user
    pb_user_account = create_pushbroom_user_account(pb_user)
    pb_user_account.user_roles << Pushbroom::UserRole.find_by_name('user')
    self.pb_user_account = pb_user_account
  end

  def create_pushbroom_user
    pb_user = Pushbroom::User.new
    pb_user.attributes = self.attributes.slice(
      "email",
      "first_name",
      "last_name",
      "dob")

    pb_user
  end

def create_pushbroom_user_account(pb_user)
    pb_user_account = Pushbroom::UserAccount.new
    pb_user_account.enabled = true
    pb_user_account.password_hash =                 Pushbroom::UserAccount.create_password_digest(@plaintext_password, self.username)
    pb_user_account.username = self.username
    pb_user_account.user = pb_user

    pb_user_account
  end
class用户“Pushbroom::UserAccount”;foreign\u key=>“pb用户帐户”;:dependent=>:destroy;:autosave=>true
#设置模型的可访问(或受保护)属性
属性可访问:名字、姓氏、用户名、日期、电子邮件、密码、密码确认、记住我
验证是否存在:名字、姓氏、用户名、dob
验证_日期:dob、:on_或_after=>lambda{100.years.ago}、:on_或_after_message=>“必须在#{100.years.ago.strftime(“%m-%d-%Y”)之上或之后”
验证_日期:dob、:on_或_before=>lambda{13.years.ago}、:on_或_before_message=>“必须在#{13.years.ago.strftime(“%m-%d-%Y”)之前或之前”
def创建推扫式用户数据
pb\U用户=创建推扫式用户
pb\U用户\U帐户=创建推扫式用户\U帐户(pb\U用户)
pb_user_account.user_角色def user_fred
ruby-1.9.2-p180:002?>{
ruby-1.9.2-p180:003>:名字=>“Fred”,
ruby-1.9.2-p180:004>:姓氏=>“燧石”,
ruby-1.9.2-p180:005>:用户名=>“fflint”,
ruby-1.9.2-p180:006>:dob=>“1986-06-01”,
ruby-1.9.2-p180:007>:电子邮件=>”fred@mydomain.org",
ruby-1.9.2-p180:008>:密码=>“错误传递”
ruby-1.9.2-p180:009?>}
ruby-1.9.2-p180:010?>结束
=>零
ruby-1.9.2-p180:011>user=user.new(user\u-fred)
=> # 
ruby-1.9.2-p180:012>user.create\u pushbroom\u user\u数据
=> # 
ruby-1.9.2-p180:013>user.pb\u user\u account.user\u角色
=> [#] 
ruby-1.9.2-p180:014>user.save!
NoMethodError:nil:NilClass的未定义方法“relation”
来自/Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activesupport-3.0.5/lib/active\u support/whiny\u nil.rb:48:in'method\u missing'
来自/Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/arel-2.0.9/lib/arel/insert_manager.rb:22:in'insert'
来自/Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/arel-2.0.9/lib/arel/crud.rb:26:in'insert'
来自/Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active\u-record/associations/has\u和\u属于\u-many\u-association.rb:76:in'insert\u-record'
来自/Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active\u record/associations/association\u proxy.rb:151:in'send'
来自/Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active\u-record/autosave\u-association.rb:306:in`block in save\u-collection\u-association'
来自/Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active\u record/associations/association\u collection.rb:431:“方法中的块丢失”
来自/Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active\u record/associations/association\u proxy.rb:216:“方法中的块丢失”
来自/Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active\u record/associations/association\u proxy.rb:216:in'each'
来自/Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active\u record/associations/associations\u proxy.rb:216:in'method\u missing'
来自/Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_-record/associations/association_-collection.rb:431:in'method_-missing'
来自/Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_-record/autosave_-association.rb:297:in'save_-collection_-association'
来自/Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_record/autosave_association.rb:163:in`block in add_autosave_association'
class User < ActiveRecord::Base

  after_create :send_welcome_email
  before_save :create_pushbroom_user_data

  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  belongs_to :pb_user_account, :class_name => "Pushbroom::UserAccount", :foreign_key => "pb_user_account_id", :dependent => :destroy, :autosave => true

  # Setup accessible (or protected) attributes for your model
  attr_accessible :first_name, :last_name, :username, :dob, :email, :password,         :password_confirmation, :remember_me

  validates_presence_of :first_name, :last_name, :username, :dob
  validates_date :dob, :on_or_after => lambda { 100.years.ago }, :on_or_after_message => "must be on or after #{100.years.ago.strftime('%m-%d-%Y')}" 
  validates_date :dob, :on_or_before => lambda { 13.years.ago }, :on_or_before_message => "must be on or before #{13.years.ago.strftime('%m-%d-%Y')}"

  def create_pushbroom_user_data
    pb_user = create_pushbroom_user
    pb_user_account = create_pushbroom_user_account(pb_user)
    pb_user_account.user_roles << Pushbroom::UserRole.find_by_name('user')
    self.pb_user_account = pb_user_account
  end

  def create_pushbroom_user
    pb_user = Pushbroom::User.new
    pb_user.attributes = self.attributes.slice(
      "email",
      "first_name",
      "last_name",
      "dob")

    pb_user
  end

def create_pushbroom_user_account(pb_user)
    pb_user_account = Pushbroom::UserAccount.new
    pb_user_account.enabled = true
    pb_user_account.password_hash =                 Pushbroom::UserAccount.create_password_digest(@plaintext_password, self.username)
    pb_user_account.username = self.username
    pb_user_account.user = pb_user

    pb_user_account
  end
ruby-1.9.2-p180 :001 > def user_fred
ruby-1.9.2-p180 :002?>       { 
ruby-1.9.2-p180 :003 >             :first_name => "Fred",
ruby-1.9.2-p180 :004 >             :last_name => "Flinstone",
ruby-1.9.2-p180 :005 >             :username => "fflint",
ruby-1.9.2-p180 :006 >             :dob => "1986-06-01",
ruby-1.9.2-p180 :007 >             :email => "fred@mydomain.org",
ruby-1.9.2-p180 :008 >             :password => "badpass"
ruby-1.9.2-p180 :009?>         }
ruby-1.9.2-p180 :010?>     end
 => nil 
ruby-1.9.2-p180 :011 > user = User.new(user_fred)
 => #<User id: nil, email: "fred@mydomain.org", encrypted_password:     "$2a$10$IiEOEoSnXIrP7VJAQYckfOVXuzm7Y5ZGo20ayLpSkHhz...", reset_password_token: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: nil, updated_at: nil, first_name: "Fred", last_name: "Flinstone", username: "fflint", dob: "1986-06-01", pb_user_account_id: nil> 
ruby-1.9.2-p180 :012 > user.create_pushbroom_user_data
=> #<Pushbroom::UserAccount id: nil, created_by: nil, created_at: nil, updated_by: nil,     updated_at: nil, admin_notes: nil, enabled: true, username: "fflint", password_hash: "blah     blah", user_id: nil, prefStore: nil, accepted_tos: nil, do_not_contact: nil> 
ruby-1.9.2-p180 :013 > user.pb_user_account.user_roles
 => [#<Pushbroom::UserRole id: 1, created_by: "script", created_at: "2008-11-10     12:10:44", updated_by: "script", updated_at: "2008-11-10 12:10:44", admin_notes: "", name:     "user", description: "Generic User Role", conditional: false>] 
ruby-1.9.2-p180 :014 > user.save!
NoMethodError: undefined method `relation' for nil:NilClass
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activesupport-    3.0.5/lib/active_support/whiny_nil.rb:48:in `method_missing'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/arel-    2.0.9/lib/arel/insert_manager.rb:22:in `insert'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/arel-    2.0.9/lib/arel/crud.rb:26:in `insert'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-    3.0.5/lib/active_record/associations/has_and_belongs_to_many_association.rb:76:in     `insert_record'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-    3.0.5/lib/active_record/associations/association_proxy.rb:151:in `send'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_record/autosave_association.rb:306:in `block in     save_collection_association'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_record/associations/association_collection.rb:431:in `block in     method_missing'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_record/associations/association_proxy.rb:216:in `block in method_missing'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_record/associations/association_proxy.rb:216:in `each'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_record/associations/association_proxy.rb:216:in `method_missing'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_record/associations/association_collection.rb:431:in `method_missing'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_record/autosave_association.rb:297:in `save_collection_association'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_record/autosave_association.rb:163:in `block in add_autosave_association_callbacks'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activesupport-3.0.5/lib/active_support/callbacks.rb:415:in `_run_create_callbacks'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_record/callbacks.rb:281:in `create'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_record/persistence.rb:246:in `create_or_update'
... 18 levels...
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_record/callbacks.rb:277:in `create_or_update'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_record/persistence.rb:56:in `save!'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_record/validations.rb:49:in `save!'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_record/attribute_methods/dirty.rb:30:in `save!'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_record/transactions.rb:245:in `block in save!'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-    3.0.5/lib/active_record/transactions.rb:292:in `block in with_transaction_returning_status'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_record/connection_adapters/abstract/database_statements.rb:139:in     `transaction'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_record/transactions.rb:207:in `transaction'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_record/transactions.rb:290:in `with_transaction_returning_status'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/activerecord-3.0.5/lib/active_record/transactions.rb:245:in `save!'
  from (irb):14
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/railties-3.0.5/lib/rails/commands/console.rb:44:in `start'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/railties-3.0.5/lib/rails/commands/console.rb:8:in `start'
  from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/railties-3.0.5/lib/rails/commands.rb:23:in `<top (required)>'
  from script/rails:6:in `require'
  from script/rails:6:in `<main>'ruby-1.9.2-p180 :015 > 
class Pushbroom::UsersRolesRelationship < ActiveRecord::Base

  establish_connection :pushbroom
  set_table_name :users_roles

  belongs_to :user_account
  belongs_to :user_role
end

class Pushbroom::UserAccount < ActiveRecord::Base

  establish_connection :pushbroom
  set_table_name :user_account
  set_primary_key :id

  has_many :users_roles_relationships
  has_many :user_roles, :through => :users_roles_relationships, :source => :user_role
end

class Pushbroom::UserRole < ActiveRecord::Base

  establish_connection :pushbroom
  set_table_name :user_role
  set_primary_key :id

  has_many :users_roles_relationships
  has_many :user_accounts, :through => :users_roles_relationships, :source => :user_account
end
def add_subscription_plan_roles_to_pb_user_account(pb_user_account)
    roles_granted = pb_user_account.user.subscriptions.first.subscription_plan.roles_granted
    pb_user_account.user_roles = roles_granted
end