2013-04-17 2 views
0

Я не уверен, что на это не было ответа, но я не уверен, что искать, поэтому, пожалуйста, укажите мне в правильном направлении, если я спрашиваю то, на что уже ответил.Ассоциация активных записей без использования id

У меня есть 2 модели:

stock_symbol и weight_symbol

stock_symbol имеет symbol в нем, который соответствует commodity в модели weight_symbol

Как я могу получить ассоциацию, чтобы работать так, когда я stock_symbol. weight_symbol, я бы получил weight_symbol обратно.

Я знаю, как это сделать в SQL, но если его не стандарт id до this_id, то я в основном потерян.

редактировать:

class StockSymbol < ActiveRecord::Base 
    has_many :weight_symbols, primary_key: :symbol 

    def commodity 
    "LC" # This is just an example to simplify it, there is much more to this. 
    end 
end 

class WeightSymbol < ActiveRecord::Base 
    belongs_to :stock_symbol, foreign_key: :commodity 
end 

Пример объекта из stock_symbol:

StockSymbol.last 
<#StockSymbol id: 729, symbol: "LCJ13C12500", created_at: "2013-03-15 21:50:49", updated_at: "2013-03-15 21:50:49"> 

объекта Образец из weight_symbol:

WeightSymbol.first 
<#WeightSymbol id:1, weight_group_id: 1, symbol: "LC", created_at: "2010-01-05 21:13:28", updated_at: "2010-01-05 21:13:28"> 

После установки этого и работает StockSymbol.last.weight_symbols.to_sql я получаю:

"SELECT `weight_symbols`.* FROM `weight_symbols` WHERE `weight_symbols`.`stock_symbol_id` = 'LCJ13C12500'" 

редактировать 2:

запросов, что он должен делать (я думаю):

SELECT * FROM `weight_symbols` WHERE `weight_symbols`.`symbol` = 'LC'; 

запрос, чтобы получить информацию, которую я хочу.

SELECT * FROM `weight_symbols` a 
JOIN `stock_symbols` b 
ON a.symbol = b.commodity 
WHERE b.symbol = 'LCJ13C12500'; 

Новый Stock Symbol объект

<#StockSymbol id: 729, symbol: "LCJ13C12500", created_at: "2013-03-15 21:50:49", updated_at: "2013-03-15 21:50:49", commodity: "LC"> 

ответ

2

Методы рельсы ассоциации поставляются с опциями, чтобы переопределить клавиши по умолчанию, используемые в отношениях. Если это один ко многим ассоциации между StockSymbol и WeightSymbol, можно использовать следующее: (. Не уверен, что если бы я получил ассоциацию правильный путь вокруг, но вы должны получить представление)

# stock_symbol.rb 
has_many :weight_symbols, primary_key: :symbol 

# weight_symbol.rb 
belongs_to :stock_symbol, foreign_key: :commodity 

В Detailed Association Reference в Association Basics guid содержит подробный список всех вариантов и методов, относящихся к каждому типу ассоциации.


EDIT: Некоторые дополнительные вещи основаны на обновленной вопрос.

Я немного смущен тем, как ваша ассоциация должна работать - WeightSymbol не имеет атрибута commodity. Должен ли WeightSymbol соответствовать его собственному StockSymbol, когда weight_symbol.symbol == stock_symbol.commodity?В этом случае вам необходимо установить ключи соответственно:

# stock_symbol.rb 
has_many :weight_symbols, primary_key: :commodity 
# :primary_key is the field on this model whose value associated models will store in their foreign_key 

# weight_symbol.rb 
belongs_to :stock_symbol, foreign_key: :symbol 
# :foreign_key is the column on this model that should match the primary_key field in the associated model 

Во-вторых, вы можете настроить только рельсы ассоциаций с использованием столбцов базы данных, вы не можете использовать метод. Если вы абсолютно необходимо использовать метод, вы могли бы, вероятно, поддельные ассоциации, например, используя что-то вроде:

# stock_symbol.rb 
def weight_symbol 
    WeightSymbol.find_by_symbol(self.commodity) 
end 

Недостатком этого может быть, что это ужасно неэффективно, и там будет много изобретать колесо участвует.

Если у вас есть возможность сделать поле базы данных, это, возможно, будет лучшим решением, в зависимости от того, как часто это может измениться. Например, если это вытекает из текущего состояния модели, вы можете настроить before_save фильтр на модели, чтобы сделать то, что обработка должна произойти, и написать соответствующее значение для этого поля:

# stock_symbol.rb 
before_save :set_commodity 

def set_commodity 
    commodity = "LC" # arrived at through whatever processing you do 
    self.commodity = commodity 
end 
+0

Я попробовал, что и это не сработало. Возможно, у меня что-то не так. Я не думал об этом, но товар - это метод вместо столбца. Надеюсь, еще есть способ сделать это. Я добавил все, что мог подумать, может помочь в вопросе. –

+0

Кажется, есть несколько вопросов, основанных на этом, и ваш обновленный вопрос. Я обновил свой ответ. –

+0

Я обновил базу данных и добавил товар в качестве столбца (я понятия не имею, почему я этого не делал раньше, так как это действительно статическая информация, поэтому спасибо за это). Я все равно получаю тот же вывод SQL. Я обновляю исходный вопрос тем, что хочу в формате SQL. Я недостаточно понимаю об этом, чтобы действительно получить то, что я делаю неправильно. Я прочитал страницы, которые вы указали, но они, похоже, не показывали мне правильный пример того, что я пытаюсь сделать. –