2013-07-01 2 views
1

Я пытаюсь использовать отношения между таблицами, первичным ключом в обеих таблицах имеет то же имя adm_id (я знаю, я знаю, но не имеют никакого контроля над БД) Я использую activerecord без Rails в JRuby.ActiveRecord без Rails: получить связанные записи

Когда я получу соответствующие записи (электронные письма), я получаю сообщение об ошибке ниже. Может ли somoene помочь мне?

require 'java' 
require 'activerecord-jdbc-adapter' 
require "C:/jruby-1.7.4/bin/ojdbc14.jar" 
Java::OracleJdbcDriver::OracleDriver 

ActiveRecord::Base.establish_connection(
    :adapter => 'jdbc', 
    :driver => 'oracle.jdbc.driver.OracleDriver', 
    :url => 'jdbc:oracle:thin:@xxxxxx:xxxx:xxx', 
    :username=>'xxx', 
    :password=>'xxx' 
) 

class Adm < ActiveRecord::Base 
    self.table_name = 'scheme1.db_all' 
    self.primary_key = 'adm_id' 
    has_many :emails 
end 

class Email < ActiveRecord::Base 
    self.table_name = 'scheme2.db_email' 
    self.primary_key = 'adm_id' 
    belongs_to :adm, :foreign_key => 'adm_id' 
end 

lid = Adm.where(adm_id: 99999999).take(1) #ok 
email = Email.where(adm_id: 99999999).take(1) #ok 
p lid.emails 

#error: NoMethodError: undefined method `emails' for #<Array:0x19bc716> 

ответ

2

Если вы просто хотите одну запись, не передаются аргументы take:

lid = Adm.where(adm_id: 3441029).take 
email = Email.where(adm_id: 3441029).take 
p lid.emails 

Если какой-либо аргумент подается в take, даже если это 1, массив результатов возвращается ,

+0

pat: два брака находятся там, чтобы проверить, существует ли хотя бы одна запись, и они работают, как я указал. Я новичок в этих пакетах, но я полагаю, что они не имеют никакого отношения к отношениям, которые я пытаюсь использовать, показывая lid.emails , а когда вы используете без параметров, вы получите следующую ошибку в JRuby 1.7.4: ArgumentError : неправильное количество аргументов, вызывающих 'take' (0 для 1) – peter

+0

Если вам нужна одна запись из запроса, лучше использовать' first', а не 'take', а затем попробуйте вызвать' emails' на результирующем экземпляре Adm: 'Adm.where (adm_id: 3441029) .first.emails' - или даже проще, если вы ищете по первичному ключу:' Adm.find (3441029) .emails' – pat

+0

ok, that works, thanks – peter

Смежные вопросы